JMX之通过RMI方式连接JMX Server

本文介绍了如何使用RMIConnector实现远程管理MBean的过程。包括定义MBean接口及其实现,创建JMXServer和JMXConnectorServer,并通过客户端代码进行远程连接和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

除了可以在HTML中管理MBean之外,我们还可以通过程序来连接JMX管理MBean。这就需要用到了JMX的Connectior,JMX提供了两种Connector:RMI Connector和JMXMP Connector(JMX message protocol Connector)。下面介绍RMI Connector。

首先还是要创建MBean接口和实现

[java]  view plain  copy
  1. package com.jmx.client;  
  2.   
  3. public interface HelloMBean {  
  4.     public String getName();  
  5.       
  6.     public void setName(String name);  
  7.       
  8.     public void helloWorld();  
  9.       
  10.     public void helloWorld(String name);  
  11.       
  12.     public String getTelephone();  
  13.       
  14. }  

[java]  view plain  copy
  1. package com.jmx.client;  
  2.   
  3. public interface HelloMBean {  
  4.     public String getName();  
  5.       
  6.     public void setName(String name);  
  7.       
  8.     public void helloWorld();  
  9.       
  10.     public void helloWorld(String name);  
  11.       
  12.     public String getTelephone();  
  13.       
  14. }  

创建JMXServer和JMXConnectorServer(通过RMI注册URL提供客户端连接)

[java]  view plain  copy
  1. package com.jmx.client;  
  2.   
  3. import java.io.IOException;  
  4. import java.lang.management.ManagementFactory;  
  5. import java.net.MalformedURLException;  
  6. import java.rmi.registry.LocateRegistry;  
  7.   
  8. import javax.management.InstanceAlreadyExistsException;  
  9. import javax.management.MBeanRegistrationException;  
  10. import javax.management.MBeanServer;  
  11. import javax.management.MalformedObjectNameException;  
  12. import javax.management.NotCompliantMBeanException;  
  13. import javax.management.ObjectName;  
  14. import javax.management.remote.JMXConnectorServer;  
  15. import javax.management.remote.JMXConnectorServerFactory;  
  16. import javax.management.remote.JMXServiceURL;  
  17.   
  18. import com.sun.jdmk.comm.HtmlAdaptorServer;  
  19.   
  20. public class HelloAgent {  
  21.     public static void main(String[] args) throws MalformedObjectNameException, NullPointerException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {  
  22.           
  23.         //create mbean server  
  24.         MBeanServer server = ManagementFactory.getPlatformMBeanServer();  
  25.           
  26.         //create object name  
  27.         ObjectName helloName = new ObjectName("jmxBean:name=hello");  
  28.           
  29.         //create mbean and register mbean  
  30.         server.registerMBean(new Hello(), helloName);  
  31.           
  32.         //create adaptor, adaptor is just a form as show mbean. It has no relation to specific mbean.  
  33.         HtmlAdaptorServer adaptor  = new HtmlAdaptorServer();  
  34.         //create adaptor name  
  35.         ObjectName adaptorName = new ObjectName("jmxAdaptor:name=adaptor,port=5050");  
  36.         //register adaptor and adaptor name  
  37.         server.registerMBean(adaptor, adaptorName);  
  38.           
  39.         adaptor.setPort(9999);  
  40.         adaptor.start();  
  41.         System.out.println("....................server start....................");  
  42.           
  43.         //JMXConnectorServer service   
  44.         try {  
  45.             //这句话非常重要,不能缺少!注册一个端口,绑定url后,客户端就可以使用rmi通过url方式来连接JMXConnectorServer  
  46.             LocateRegistry.createRegistry(8888);  
  47.             JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8888/server");  
  48.             JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);  
  49.             System.out.println("....................begin rmi start.....");  
  50.             cs.start();  
  51.             System.out.println("....................rmi start.....");   
  52.         } catch (MalformedURLException e) {  
  53.             e.printStackTrace();  
  54.         } catch (IOException e) {  
  55.             e.printStackTrace();  
  56.         }     
  57.     }  
  58. }  

这里的8888(默认为1099)是通讯端口或者查找端口,服务端在createRegistry时实际上会new ServerSocket(8888),客户端的socket通过与端口号为8888的服务端端口互联lookup到server对象。客户端获取到的server对象在和服务端的sketon对象进行通讯时实际上也会建立socket连接,数据传输时的ServerSocket也需要一个端口(不同于通讯端口),称之为数据端口。


创建客户端代码远程连接JMXConnectorServer操作MBean

[java]  view plain  copy
  1. package com.jmx.client;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5.   
  6. import javax.management.Attribute;  
  7. import javax.management.MBeanInfo;  
  8. import javax.management.MBeanServerConnection;  
  9. import javax.management.MBeanServerInvocationHandler;  
  10. import javax.management.ObjectInstance;  
  11. import javax.management.ObjectName;  
  12. import javax.management.remote.JMXConnector;  
  13. import javax.management.remote.JMXConnectorFactory;  
  14. import javax.management.remote.JMXServiceURL;  
  15.   
  16. import com.jmx.demo.HelloMBean;  
  17.   
  18. public class Client {     
  19.       
  20.     public static void main(String[] args) throws Exception {  
  21.           
  22.         //connect JMX  
  23.         JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8888/server");  
  24.         JMXConnector jmxc = JMXConnectorFactory.connect(url,null);  
  25.         MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();       
  26.         ObjectName mbeanName = new ObjectName("jmxBean:name=hello");     
  27.           
  28.         //print domains  
  29.         System.out.println("Domains:---------------");  
  30.         String domains[] = mbsc.getDomains();  
  31.         for (int i = 0; i < domains.length; i++) {         
  32.             System.out.println("\tDomain[" + i +"] = " + domains[i]);      
  33.         }     
  34.         //MBean count  
  35.         System.out.println("MBean count = " + mbsc.getMBeanCount());      
  36.           
  37.         //process attribute  
  38.         mbsc.setAttribute(mbeanName, new Attribute("Name""new value"));//set value  
  39.         System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));//get value  
  40.           
  41.         //invoke via proxy  
  42.         HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.classfalse);          
  43.         proxy.helloWorld();  
  44.         proxy.helloWorld("I'll connect to JMX Server via client.");     
  45.           
  46.         //invoke via rmi  
  47.         mbsc.invoke(mbeanName, "helloWorld"nullnull);           
  48.         mbsc.invoke(mbeanName, "helloWorld"new Object[] { "I'll connect to JMX Server via client2." }, new String[] { String.class.getName() });     
  49.           
  50.         //get mbean information  
  51.         MBeanInfo info = mbsc.getMBeanInfo(mbeanName);           
  52.         System.out.println("Hello Class:" + info.getClassName());        
  53.         System.out.println("Hello Attriber:" + info.getAttributes()[0].getName());       
  54.         System.out.println("Hello Operation:" + info.getOperations()[0].getName());     
  55.           
  56.         //ObjectName of MBean  
  57.         System.out.println("all ObjectName:---------------");          
  58.         Set set = mbsc.queryMBeans(nullnull);  
  59.         for (Iterator it = set.iterator(); it.hasNext();) {  
  60.             ObjectInstance oi = (ObjectInstance)it.next();          
  61.             System.out.println("\t" + oi.getObjectName());          
  62.         }  
  63.         jmxc.close();       
  64.     }      
  65. }  



转载自:http://blog.youkuaiyun.com/DryKillLogic/article/details/38412913

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值