`
raymond.chen
  • 浏览: 1426496 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JMX学习总结(代码)

    博客分类:
  • Java
 
阅读更多

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的精髓。 总结来说,JMX是Java平台的重要管理工具,它提供了一种统一的接口来管理和监控应用程序和服务。通过《JMX技术介绍》一书及其配套源代码,读者可以深入了解并熟练运用...

    Jmx实例demo下载

    总结来说,`jmxdemo`项目是一个实用的学习资源,可以帮助你深入理解JMX机制,提高你在Java环境中进行系统管理和监控的能力。通过实际操作和调试代码,你可以更直观地了解JMX的工作流程,并将其应用于自己的项目中。

    JMX需要的JAR和文档和可运行的例子

    `JMX学习总结.docx`和`JMX技术.docx`可能是两份文档,详细介绍了JMX的基本概念、API使用方法以及最佳实践。这些文档将帮助你理解MBean的生命周期管理、MBeanServer的交互方式,以及如何使用Notification机制进行事件...

    JBOSS使用指南,JMX原理和应用,EJB3.0使用说明

    总结,理解并熟练掌握JBoss的配置、JMX的使用以及EJB3.0的编程模型,将有助于你更好地在企业环境中部署和管理Java应用程序,提升开发效率和系统稳定性。通过深入学习这些知识点,你可以更加游刃有余地应对复杂的Java...

    Tomcat6源代码学习(运行源代码及调试)

    总结,学习Tomcat6源代码不仅是提升技术深度的过程,也是对Java Web原理的深入探索。通过阅读源代码、运行和调试,我们可以更好地理解这个强大的服务器工作原理,为日常开发和问题解决提供坚实的理论基础。

    org.apache.aries.jmx.blueprint.api-1.1.0.zip

    标题中的"org.apache.aries.jmx.blueprint.api-...通过深入研究这些内容,开发者不仅可以了解如何在OSGi环境中使用Apache Aries JMX Blueprint API,还可以学习如何构建和优化工作流,以及如何参与到开源项目中去。

    metrics-jmx:一个示例项目,显示Dropwizard指标的用法并通过JMX公开它们

    `metrics-jmx`项目的源代码提供了实际示例,展示了如何在服务端创建和更新指标,以及如何通过JMX客户端工具(如JConsole或VisualVM)查看和操作这些指标。这对于开发者调试、优化和监控生产环境的应用非常有价值。 ...

    5年的JavaSE开发经验总结的代码

    12. **JVM优化**:理解JVM的运行机制,包括类加载、内存模型、垃圾回收策略等,以及如何通过JMX和JVisualVM等工具进行性能调优。 13. **设计模式**:熟悉并能应用常见的设计模式,如单例、工厂、观察者、装饰者、...

    JVM学习资料+笔记

    1. JMX(Java Management Extensions):提供管理和监控JVM的工具,可以查看运行时的内存、线程、类装载情况等。 2. jstat:命令行工具,用于收集JVM的各种统计信息,如垃圾收集、类装载、内存使用等。 3. ...

    TOMCAT_7_0_27源代码

    总结,Tomcat 7.0.27的源代码揭示了其内部的复杂性和精细设计。通过深入研究这些源码,开发者不仅可以理解Web服务器的工作原理,还可以定制化Tomcat以满足特定需求,或者为社区贡献代码,推动其持续发展。对于任何...

    14JVM调优.md,学习代码

    3. **JMX(Java Management Extensions)**:允许程序暴露管理属性,实现远程监控。 六、JVM性能优化实践 1. **对象池技术**:减少对象创建和销毁的开销。 2. **字符串去重**:避免大量重复字符串占用内存。 3. **...

    常用代码汇总

    【描述】"常用代码总结"提示我们这份文档集可能是对程序员在工作中经常遇到的问题和解决方案的整理,它可能包含了各种编程语言的关键点,如Java、Python、C++等,以及一些开发工具的使用方法,例如JVM监控、Vim编辑...

    12 垃圾回收相关概念.md,学习代码

    因此,理解和监控GC行为至关重要,例如通过JMX、VisualVM等工具监控GC日志,找出可能的问题并进行调优。 总结,垃圾回收是现代编程语言中的核心功能,它简化了内存管理,但也带来了性能挑战。理解垃圾回收的工作...

    Java JDK17版 最新源代码文件 src.zip

    总结起来,JDK17的源代码提供了丰富的学习材料,涵盖了从基础的JVM管理、性能优化、调试工具到XML处理的各个层面。开发者可以通过深入研究这些源码,提升自己的Java技能,更好地理解和利用Java平台的能力。

    csparql-ui-0.1.zip

    【标题】"csparql-ui-0.1.zip" 是一个与CSParQL相关的用户界面软件包,可能是一个用于处理复杂事件处理(CSPARQL)...通过研究这些源代码,他们不仅可以学习如何使用CSParQL和JMX,还可以学习开源项目开发的最佳实践。

    java tutorial

    在给定的标签"源码"中,可能涉及到对特定Java库或框架的源码研究,例如,分析某个开源项目是如何实现特定功能的,或者学习优秀代码的结构和设计模式。 三、Java工具 1. IDE:IntelliJ IDEA、Eclipse和NetBeans是...

    j2ee超级核心技术笔记与代码

    总结,《J2EE超级核心技术笔记与代码》这份资料涵盖了J2EE开发的方方面面,无论是初学者还是经验丰富的开发者,都能从中受益。通过深入学习,开发者可以更好地理解和运用J2EE技术,提升在企业级项目中的实战能力。

    activemq学习心得.docx

    以下是activemq学习心得的知识点总结: 一、activemq配置文件 activemq的配置文件是XML格式,名称为activemq.xml。该文件用于配置activemq的各种参数,例如持久化adapter、存储使用量、临时存储使用量等。在...

    spring quartz代码事例

    总结,这个"spring quartz代码事例"可能涵盖了Spring与Quartz的集成、任务和触发器的定义、配置和管理,以及动态调度的实现。学习这个例子有助于理解如何在Spring应用中高效地利用Quartz进行任务调度。

    java远程监控,有源码的

    - "java-remote-control"很可能包含了一个简单的JMX远程监控示例,包括服务器端的MBean实现、MBean Server配置以及客户端的连接和控制代码。 - 开发者可以通过阅读源码了解如何创建和注册MBean,设置JMX连接器,并...

Global site tag (gtag.js) - Google Analytics