JMX学习小结(代码)
JMX学习总结(代码)
Server端代码:
MBeanServer mbeanServer = getMBeanServer(); //MyNotification MyNotificationMBean mbean = new MyNotification(); ObjectName notiObjectName = new ObjectName("com.travelsky.com:name=MyNotification"); mbeanServer.registerMBean(mbean, notiObjectName); ((MyNotification)mbean).addNotificationListener(new MyNotificationListener(), null, null); startConnectorServer(mbeanServer); private static MBeanServer getMBeanServer() throws Exception { MBeanServer mbeanServer = null; List<MBeanServer> serverList = MBeanServerFactory.findMBeanServer(null); if(!CollectionUtils.isEmpty(serverList)){ mbeanServer = serverList.get(0); }else{ mbeanServer = MBeanServerFactory.createMBeanServer(); } return mbeanServer; } private static void startConnectorServer(MBeanServer mbeanServer) throws Exception { LocateRegistry.createRegistry(1090); String serviceURL = "service:jmx:rmi:///jndi/rmi://localhost:1090/jmxrmi"; JMXConnectorServer connectorServer = JMXConnectorServerFactory .newJMXConnectorServer(new JMXServiceURL(serviceURL), null, mbeanServer); connectorServer.start(); }
Client端代码:
范例一:
String serviceURL = "service:jmx:rmi:///jndi/rmi://localhost:1090/jmxrmi"; JMXServiceURL address = new JMXServiceURL(serviceURL); JMXConnector connector = JMXConnectorFactory.connect(address); MBeanServerConnection connection = connector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("com.travelsky.com:name=MyNotification"); final MyNotificationMBean mbean = JMX.newMBeanProxy(connection, objectName, MyNotificationMBean.class); System.out.println(mbean.getVersion()); mbean.updateName("new name");
范例二:
String serviceURL = "service:jmx:rmi:///jndi/rmi://localhost:1090/jmxrmi"; JMXServiceURL address = new JMXServiceURL(serviceURL); JMXConnector connector = JMXConnectorFactory.connect(address); MBeanServerConnection connection = connector.getMBeanServerConnection(); ObjectName objectName = new ObjectName("com.travelsky.com:name=MyNotification"); Object[] parameters = new Object[] {"new name"}; String[] signatures = new String[] {"java.lang.String"}; String result = (String)connection.invoke(objectName, "updateName", parameters, signatures);
消息模型代码
MBean类继承NotificationBroadcasterSupport类,在方法体中构造Notification对象,调用sendnotification方法发送消息。
public interface MyNotificationMBean { public void updateName(String name); public String getVersion(); } public class MyNotification extends NotificationBroadcasterSupport implements MyNotificationMBean { private String name; @Override public void updateName(String name) { this.name = name; Notification notification = new Notification( "Event", this.getClass().getName(), -1, System.currentTimeMillis(), "update name to " + this.name ); Map<String, Object> userData = new HashMap<String, Object>(); userData.put("name", this.name); notification.setUserData(userData); sendNotification(notification); } @Override public String getVersion() { return "1.0.0"; } }
新建一个消息监听器类,该类实现NotificationListener接口。
public class MyNotificationListener implements NotificationListener { @Override public void handleNotification(Notification notification, Object handback) { System.out.println("reveive notification"); @SuppressWarnings("unchecked") Map<String, Object> userData = (Map<String, Object>)notification.getUserData(); System.out.println("name: " + userData.get("name")); System.out.println("type: " + notification.getType()); System.out.println("source: " + notification.getSource()); System.out.println("message: " + notification.getMessage()); } }
通过Spring配置JMX
Server端配置:
<bean id="myNotification" class="com.cjm.jmx.mbean.MyNotification" /> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <property name="beans"> <map> <entry key="com.cjm:name=myNotification" value-ref="myNotification"/> </map> </property> <property name="server" ref="mbeanServer" /> <property name="notificationListenerMappings"> <map> <entry key="com.cjm:name=myNotification"> <bean class="com.cjm.jmx.mbean.MyNotificationListener" /> </entry> </map> </property> </bean> <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> <property name="locateExistingServerIfPossible" value="true"/> </bean> <bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean" destroy-method="destroy"> <property name="port" value="1090" /> </bean> <bean id="jmxServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry"> <property name="objectName" value="connector:name=rmi" /> <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://localhost:1090/myNotification" /> <property name="server" ref="mbeanServer" /> <property name="environment"> <props> <prop key="java.naming.security.principal">uid</prop> <prop key="java.naming.security.credentials">pwd</prop> </props> </property> </bean>
Client端配置:
<bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean"> <property name="serviceUrl" value="service:jmx:rmi:///jndi/rmi://localhost:1090/myNotification" /> <property name="environment"> <map> <entry key="jmx.remote.credentials"> <bean class=" org.springframework.util.StringUtils" factory-method="commaDelimitedListToStringArray"> <constructor-arg value="uid,pwd" /> </bean> </entry> </map> </property> </bean> <bean id="mbeanProxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean"> <property name="connectOnStartup" value="true" /> <property name="objectName" value="com.cjm:name=myNotification" /> <property name="proxyInterface" value="com.cjm.jmx.mbean.MyNotificationMBean" /> <property name="server" ref="clientConnector" /> </bean> <bean id="counter" class="com.cjm.jmx.test.Counter"> <property name="myNotificationMBean" ref="mbeanProxy" /> </bean>
JMX实现框架:
1、JDMK
JDMK(Java Dynamic Management Kit)是由JAVA的一个应用程序接口(JAVA API)和一套开发工具组成的。JDMK是JMX的第一个商业化产品,它是JMX(Java Management extensions)的一个实现,它提供了通过Java应用程序来管理Java对象的一个框架。
//编程方式 AuthInfo[] authInfos = new AuthInfo[]{new AuthInfo("admin", "admin")}; HtmlAdaptorServer jdmkHtmlAdaptor = new HtmlAdaptorServer(9999, authInfos);//默认端口为8082 ObjectName jdmkObjectName=new ObjectName("com.cjm:name=jdmkHtmlAdaptor"); server.registerMBean(jdmkHtmlAdaptor, jdmkObjectName); jdmkHtmlAdaptor.start(); //http://localhost:9999/
<!-- Spring配置方式 --> <bean id="jdmkHtmlAdaptor" class="com.sun.jdmk.comm.HtmlAdaptorServer" init-method="start"> <constructor-arg index="0" value="9999" /> <constructor-arg index="1"> <bean id="authInfo" class="com.sun.jdmk.comm.AuthInfo"> <property name="login" value="admin" /> <property name="password" value="admin" /> </bean> </constructor-arg> </bean>
2、MX4J
MX4J是一个开源JMX管理框架,支持JSR3 (JMX) 和JSR160 (JMX Remote API)。通过Spring将MX4J集成到应用系统中,可以通过HTTP协议适配器,能够基于Web的方式来实现对应用系统的监控和管理。
HttpAdaptor mx4jHttpAdaptor = new HttpAdaptor(8888); //default is 8080 XSLTProcessor xsltProcessor = new XSLTProcessor(); mx4jHttpAdaptor.setProcessor(xsltProcessor); ObjectName mx4jObjectName=new ObjectName("com.cjm:name=mx4jHttpAdaptor"); server.registerMBean(mx4jHttpAdaptor, mx4jObjectName); mx4jHttpAdaptor.start();
<bean id="mx4jHttpAdaptor" class="mx4j.tools.adaptor.http.HttpAdaptor" init-method="start"> <property name="processor"> <bean class="mx4j.tools.adaptor.http.XSLTProcessor" /> </property> <property name="host" value="localhost" /> <property name="port" value="8888" /> </bean>