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>
相关推荐
通过实践,学习者可以更深入地掌握JMX的精髓。 总结来说,JMX是Java平台的重要管理工具,它提供了一种统一的接口来管理和监控应用程序和服务。通过《JMX技术介绍》一书及其配套源代码,读者可以深入了解并熟练运用...
总结来说,`jmxdemo`项目是一个实用的学习资源,可以帮助你深入理解JMX机制,提高你在Java环境中进行系统管理和监控的能力。通过实际操作和调试代码,你可以更直观地了解JMX的工作流程,并将其应用于自己的项目中。
总结来说,JMX提供了一种统一的管理和监控机制,通过MBeans、MBeanServer和JMX Connectors,开发者可以轻松地为Java应用程序添加管理和监控功能。理解并熟练运用JMX对于构建可扩展、可维护的大型Java系统至关重要。
`JMX学习总结.docx`和`JMX技术.docx`可能是两份文档,详细介绍了JMX的基本概念、API使用方法以及最佳实践。这些文档将帮助你理解MBean的生命周期管理、MBeanServer的交互方式,以及如何使用Notification机制进行事件...
总结来说,JMX规范通过提供一个统一的、标准化的管理解决方案,使得Java应用程序和组件的管理变得更加高效和可靠。无论是对于软件编程人员、网络管理人员,还是对于希望遵循JMX规范管理硬件设备和应用接口的编程人员...
总结,理解并熟练掌握JBoss的配置、JMX的使用以及EJB3.0的编程模型,将有助于你更好地在企业环境中部署和管理Java应用程序,提升开发效率和系统稳定性。通过深入学习这些知识点,你可以更加游刃有余地应对复杂的Java...
### JMX in Action #### 重要知识点概览 《JMX in Action》是一本由Ben G....通过本书的学习,读者可以掌握JMX的基本概念、关键技术以及最佳实践,从而提高自己在资源管理和系统监控方面的能力。
总结,学习Tomcat6源代码不仅是提升技术深度的过程,也是对Java Web原理的深入探索。通过阅读源代码、运行和调试,我们可以更好地理解这个强大的服务器工作原理,为日常开发和问题解决提供坚实的理论基础。
通过本次讨论,我们深入了解了**软件监控与管理**的重要性,学习了**JMX**的基本概念和发展历程,并探讨了不同类型的MBeans以及它们的应用场景。特别是结合**Spring**框架的使用,让JMX的管理和配置变得更加简单高效...
标题中的"org.apache.aries.jmx.blueprint.api-...通过深入研究这些内容,开发者不仅可以了解如何在OSGi环境中使用Apache Aries JMX Blueprint API,还可以学习如何构建和优化工作流,以及如何参与到开源项目中去。
`metrics-jmx`项目的源代码提供了实际示例,展示了如何在服务端创建和更新指标,以及如何通过JMX客户端工具(如JConsole或VisualVM)查看和操作这些指标。这对于开发者调试、优化和监控生产环境的应用非常有价值。 ...
12. **JVM优化**:理解JVM的运行机制,包括类加载、内存模型、垃圾回收策略等,以及如何通过JMX和JVisualVM等工具进行性能调优。 13. **设计模式**:熟悉并能应用常见的设计模式,如单例、工厂、观察者、装饰者、...
1. JMX(Java Management Extensions):提供管理和监控JVM的工具,可以查看运行时的内存、线程、类装载情况等。 2. jstat:命令行工具,用于收集JVM的各种统计信息,如垃圾收集、类装载、内存使用等。 3. ...
总结,Tomcat 7.0.27的源代码揭示了其内部的复杂性和精细设计。通过深入研究这些源码,开发者不仅可以理解Web服务器的工作原理,还可以定制化Tomcat以满足特定需求,或者为社区贡献代码,推动其持续发展。对于任何...
3. **JMX(Java Management Extensions)**:允许程序暴露管理属性,实现远程监控。 六、JVM性能优化实践 1. **对象池技术**:减少对象创建和销毁的开销。 2. **字符串去重**:避免大量重复字符串占用内存。 3. **...
总结来说,Ehcache的监控涉及了多个方面,包括但不限于使用JMX、Web Console、配置参数调整以及源码阅读。通过深入理解这些监控手段和工具,开发者能够更有效地管理和优化Ehcache,从而提升应用的性能和稳定性。同时...
【描述】"常用代码总结"提示我们这份文档集可能是对程序员在工作中经常遇到的问题和解决方案的整理,它可能包含了各种编程语言的关键点,如Java、Python、C++等,以及一些开发工具的使用方法,例如JVM监控、Vim编辑...
因此,理解和监控GC行为至关重要,例如通过JMX、VisualVM等工具监控GC日志,找出可能的问题并进行调优。 总结,垃圾回收是现代编程语言中的核心功能,它简化了内存管理,但也带来了性能挑战。理解垃圾回收的工作...
总结起来,JDK17的源代码提供了丰富的学习材料,涵盖了从基础的JVM管理、性能优化、调试工具到XML处理的各个层面。开发者可以通过深入研究这些源码,提升自己的Java技能,更好地理解和利用Java平台的能力。
### Java学习路径总结 Java学习之路漫长而充满挑战,但只要按照科学的学习路径,从基础开始,逐步深入,最终能够达到精通。从Java基础到Java API,再到Java WEB和JavaEE的进阶,每一步都是构建坚实技术底蕴的关键。...