最近参加短信网关的开发,开发技术采用了spring+hibernate+mule+jms;从业务层发送到手机用户的信息先发送到JMS服务器的一个队列里(jms:queue_MT),短信网关一直监测该队列(jms:queue_MT),如果发现队列中有新的信息就取出准备发送;这样可以实现了架构的松耦合。
但是由于移动方面规定的滑动窗口大小只有16,如果几个不同的业务同时向用户群发信息的话就会造成有很多信息堵塞。上个星期五,我的师兄告诉我由于发送信息的速度比较慢,已经上行了20000条信息,但是只收到5000条信息的回复,也就是说有15000条信息在等待发送。为了实时监测短信网关发送信息的情况,周末决定利用JMX实现对网关的监测。主要是监测待发送信息的数量。
1.导出的MBean为ConnectionBean,该类有一size的属性标识待发送信息的数量
<beans>
<bean id="connection" class="com.ll.smsbeans.ConnectionBean">
<constructor-arg index ="0" ><value>900509</value></constructor-arg>
<constructor-arg index ="1"><value>1234</value></constructor-arg>
</bean>
2.配置MbeanExporter类并传入需要导出的MBean
代码:
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=connectionBean">
<ref local="connection"/>
</entry>
</map>
</property>
<property name="server" ref="mbeanServer"/>
</bean>
3.注意当使用一个RMI-based连接器时,你需要启动lookup服务(tnameserv或rmiregistry)用来完成名称注册。如果你通过RMI使用Spring发布远程服务,Spring还要构造一个RMI注册项。如果没有,你可以容易地使用下面的配置项启动一个注册:
代码:
<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
<property name="port" value="9875"/>
</bean>
4.创建一个MBeanServer
如上所示的配置中假定该应用运行在一个有且只有一个MbeanServer正在运行的环境中。在这种情况下,Spring将定位正在运行的MbeanServer并注册你的beans到其中。这在你的应用运行在一个拥有自己的MbeanServer的容器内如Tomcat或者IBM WebSphere时很有用。
然而,这个方法无法用于独立环境中,或者当它运行在一个没有提供MbeanServer的容器时。为了克服这种困难,你可以通过在配置中声明添加一个org.springframework.jmx. support.MbeanServerFactoryBean的实例来创建MbeanServer的实例。通过设置MbeanExporter的server属性为MbeanServerFactoryBean,你同样可以确保这个MbeanServer被使用。如下所示:
代码:
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"/>
5.服务端连接器
Spring JMX使用下面的配置创建、启动和发布一个JSR-160 JMXConnectorServer
代码:
<bean id="serverConnector" class="org.springframework.jmx.support.ConnectorServerFactoryBean">
<property name="objectName" value="connector:name=rmi"/>
<property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:9875/myconnector"/>
</bean>
最后,可以利用JDK5.0附带的JMX工具JConsole.exe作为客户端连接到服务器中实时参考信息的发送情况。在JConsole.exe的 连接->高级->service地址中填写:service:jmx:rmi://localhost/jndi/rmi://localhost:9875/myconnector即可!