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>

猜你喜欢

转载自chenjumin.iteye.com/blog/2247651
JMX
今日推荐