JMX : Remote Management

来源:互联网 发布:华东电脑旗下华讯网络 编辑:程序博客网 时间:2024/04/30 14:38

JMX connector

remote Java client 通过connector来访问MBean,connector的client side的接口和MBean的接口保持一致。


两部分:

connector client : 创建与server之间的连接。通常处于和server不同的JVM上,或处于不同的机器上。

connector server : 与MBean Server一起,监听来自client的请求。


connection protocol是基于RMI的 : JMX client远程连接到MBeanServer,操作MBean,就像操作本地的对象一样。


out-of-the-box RMI connector

JavaSE提供了out-of-the-box RMI connector,用户就不需要自定义特定的connector了。

通过特定的Java启动参数来启动程序,就可以启动程序的out-of-the-box management agent。

如此,实现了JMX technology的远程程序就可以连接到程序并进程操作,比如JConsole。

对于前面的Standard MBean,只需启动时加上参数:

-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
注: 此为测试程序,因此没有authenticate。

使用JConsole:




前面说的测试都是用JRE自带的JConsole,下面来编写自己的Client来访问MBean。

package test.xue.mbean.client;import java.io.IOException;import java.util.Set;import javax.management.JMX;import javax.management.MBeanServerConnection;import javax.management.MalformedObjectNameException;import javax.management.ObjectName;import javax.management.remote.JMXConnector;import javax.management.remote.JMXConnectorFactory;import javax.management.remote.JMXServiceURL;import test.xue.mbean.HelloMBean;public class MBeanClient {public static void main(String[] args) throws IOException,MalformedObjectNameException, NullPointerException {JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.1.102:9999/jmxrmi");JMXConnector connector = JMXConnectorFactory.connect(url);MBeanServerConnection connection = connector.getMBeanServerConnection();// list domainsString[] domains = connection.getDomains();for (String domain : domains) {System.out.println("domain : " + domain);}// list ObjectNamesSet<ObjectName> names = connection.queryNames(null, null);for (ObjectName name : names) {System.out.println("ObjectName : " + name);}// remote operationObjectName name = new ObjectName("test.xue.mbean:type=Hello");HelloMBean mbean = JMX.newMBeanProxy(connection, name, HelloMBean.class);mbean.sayHello();System.out.println("1 + 2 ="+mbean.add(1, 2));// close connectionconnector.close();}}

输出为:

domain : JMImplementationdomain : com.sun.managementdomain : java.langdomain : test.xue.mbeandomain : java.util.loggingObjectName : java.lang:type=MemoryObjectName : java.lang:type=GarbageCollector,name=CopyObjectName : test.xue.mbean:type=HelloObjectName : java.lang:type=MemoryPool,name=Code CacheObjectName : java.lang:type=RuntimeObjectName : java.lang:type=ClassLoadingObjectName : java.lang:type=MemoryPool,name=Perm Gen [shared-rw]ObjectName : java.lang:type=ThreadingObjectName : java.lang:type=MemoryPool,name=Perm Gen [shared-ro]ObjectName : java.util.logging:type=LoggingObjectName : java.lang:type=CompilationObjectName : java.lang:type=MemoryPool,name=Eden SpaceObjectName : com.sun.management:type=HotSpotDiagnosticObjectName : java.lang:type=GarbageCollector,name=MarkSweepCompactObjectName : java.lang:type=MemoryPool,name=Survivor SpaceObjectName : java.lang:type=OperatingSystemObjectName : java.lang:type=MemoryPool,name=Perm GenObjectName : java.lang:type=MemoryPool,name=Tenured GenObjectName : java.lang:type=MemoryManager,name=CodeCacheManagerObjectName : JMImplementation:type=MBeanServerDelegate1 + 2 =3