JMX 注册MBean服务 MBean RMI

来源:互联网 发布:中国劳动关系学院知乎 编辑:程序博客网 时间:2024/04/28 21:56
 

JMX 注册MBean服务 MBean RMI

X的概念不说了,可以管理很多组件,例子程序用了简单的bean,然后JMX注册它进行管理,JMX可以管理其他高级组件,管理osgi等等。jmx可以通过http,rmi等方式管理组件,jmx配上osgi来管理组件就很好了,osgi。。。

try {
            String DOMAIN = "localhost";
            // 创建一个MBeanServer

            MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);
            // 用MBeanServer注册LoginStatsMBean
            // MBeanServer.registerMBean(Object,ObjectName)方法使用的参数有两个:一个是MBean实现的一个实例;另一个是类型ObjectName的一个对象-它用于唯一地标识该MBean
            server.registerMBean(new Status(), new ObjectName(DOMAIN + ":name=statusBean"));
            // 存取该JMX服务的URL:
            JMXServiceURL url = new JMXServiceURL("rmi", "127.0.0.1", 9589, "/jndi/rmi://localhost:" + 1099 + "/linpeiwen");
            // start()和stop()来启动和停止 JMXConnectorServer
            JMXConnectorServer jmxServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);

            System.out.println(url);
            // 在RMI上注册
            LocateRegistry.createRegistry(1099);

            jmxServer.start();

        } catch (Exception e) {
            e.printStackTrace();
        }

通过JConsole便可以访问这个MBEAN里面的public方法:

 

在JMX URL中输入jmx service url: service:jmx:rmi:///jndi/rmi://localhost:1099/linpeiwen

就可以访问到注册到的MBean中的方法.

 

例子程序:

//SimpleStandardMBean.java 简单的被管理的bean

public interface SimpleStandardMBean {

public void setName(String name);

public String getName(String name);

public void reSet();

public int getAge();
}

//SimpleStandard.java 简单的被管理的bean的实现

public class SimpleStandard implements SimpleStandardMBean{

public String name;
public int getAge() {
   return 24;
}

public String getName(String name) {
   this.name=name;
   System.out.println("----------调用了getName方法----------");
   return this.name;
}

public void reSet() {
   System.out.println("----------reSet()-----------");
}

public void setName(String name) {
   this.name=name;  
}

public void aaa(){
   System.out.println("888888888888888888888");
}

}


//Server.java 测试程序

import java.io.File;
import java.io.IOException;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class Server {

private static MBeanServer server;

private static int PORT = 10022;

private static final String DOMAIN = "linpeiwen";

public static void init() throws Exception {
   server = MBeanServerFactory.createMBeanServer(DOMAIN);
   // server = ManagementFactory.getPlatformMBeanServer();
   server.registerMBean(new SimpleStandard(), new ObjectName(DOMAIN + ":name=standard"));
   initialize();
   JMXServiceURL serviceURL = new JMXServiceURL(
     "service:jmx:rmi://localhost/jndi/rmi://localhost:" + PORT
       + "/" + DOMAIN);
   JMXConnectorServer connectorServer = JMXConnectorServerFactory
     .newJMXConnectorServer(serviceURL, null, server);
   server.registerMBean(connectorServer, new ObjectName(
     "connector:name=rmi"));
   connectorServer.start();
   System.out.print("startup....");
}

private static void initialize() throws IOException {
   // URL serverPolicyFileName = new URL("server.policy"); //$NON-NLS-1$
   // (serverPolicyBundleURL);
   // URL serverPolicyBundleURL =
   // FileLocator.toFileURL(serverPolicyFileName);
   File file = new File("D:/workspace/jxmdemo/src/com/server.policy");
   System
     .setProperty(
       "java.security.policy", "D:/workspace/jxmdemo/src/com/server.policy"); //$NON-NLS-1$
   LocateRegistry.createRegistry(PORT);
   System.setSecurityManager(new RMISecurityManager());
}

public static void main(String[] args) {

   try {
    init();
   } catch (Exception ex) {
    ex.printStackTrace();
   }
}
}

//Client.java 测试程序

import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class Client {
private static int PORT = 10022;

private static final String DOMAIN = "linpeiwen";
public static void main(String[] args) {
   try {
    //创建jmx连接
    JMXServiceURL jmxUrl=new JMXServiceURL("service:jmx:rmi://localhost/jndi/rmi://localhost:" + PORT
      + "/" + DOMAIN);
    Map<String ,String> map=new HashMap();
    map.put("jmx.remote.protocol.provider.pkgs", "org.logicblaze.lingo.jmx.remote.provider");
    JMXConnector jmxConn=JMXConnectorFactory.connect(jmxUrl,map);
    //获得MBean服务连接
    MBeanServerConnection mbsConn=jmxConn.getMBeanServerConnection();
    String defaultDedomain=mbsConn.getDefaultDomain();
    ObjectName objname=null;
    objname=new ObjectName(defaultDedomain + ":name=standard");
    Object[] para={"standard"};//参数名
    String[] paraType={"java.lang.String"};//参数类型
    Object str=mbsConn.invoke(objname, "getName", para, paraType);//调用服务端的方法
    System.out.println("name=" + str.toString());
    } catch (Exception e) {   
    e.printStackTrace();
   }
}
}

//server.policy

grant { permission java.security.AllPermission; };

原创粉丝点击