jmx

jmx是java程序之间互为通讯,rpc调用风格.应用场景:集群环境内快速度部署java 程序,可发布分析数据程序java

package testplus2.game;

import java.util.Set;

import javax.management.ObjectName;
/**
 * jmx 服务接口 服务端与客户端
 * 
 * @author solq
 * */
public interface IJmxService {
    public void close();

    // /////////服务端部分//////////////
    
    /**
     * 注册MBEAN
     * */
    public void register(Object mbean);

    /**
     * 启动jxm服务端
     * */
    public void start();

    // /////////客户端部分//////////////
    /**
     * 链接jxm服务端
     * */
    public void connect();

    /**
     * 获取mbean proxy
     * @param clz 注意是接口
     * */
    public <T> T getRpcProxy(Class<T> clz);
    /**
     * 获取mbean proxy
     * @param clz 注意是接口
     * @param impClz 实现类
     * */
    public <T> T getRpcProxy(Class<T> clz, Class<? extends T> impClz);
    /**
     * 获取jxm服务端全部注册mbean 
     * */
    public Set<ObjectName> getAllRegisterMBean();
}
package testplus2.game;

import java.io.IOException;
import java.rmi.registry.LocateRegistry;
import java.util.Set;

import javax.management.JMX;
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.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import com.sun.jdmk.comm.HtmlAdaptorServer;

/**
 * jmx 服务实现
 * 
 * @author solq
 * */
public class JmxService implements IJmxService {

    private boolean startServer;

    private String host;
    private int port;

    // server
    private MBeanServer mbeanServer;
    private JMXConnectorServer jmxConnectorServer;

    // client
    private JMXConnector jxmConnector;
    private MBeanServerConnection beanServerConnection;

    public JmxService(String host, int port) {
        this.host = host;
        this.port = port;
    }

    @Override
    public void register(Object obj) {
        initServer();
        try {
            ObjectName connectorName = new ObjectName(JxmUtli.getObjectName(obj
                    .getClass()));
            mbeanServer.registerMBean(obj, connectorName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initServer() {
        if (mbeanServer == null) {
            mbeanServer = MBeanServerFactory.createMBeanServer();
        }
    }

    @Override
    public void start() {
        if (startServer) {
            System.out.println("已启动JMX :" + port);
            return;
        }
        this.startServer = true;
        initServer();
        try {

            // 启动server
            LocateRegistry.createRegistry(port);
            final JMXServiceURL url = new JMXServiceURL(
                    "service:jmx:rmi://localhost/jndi/rmi://" + host + ":"
                            + port + "/jmxrmi");
            jmxConnectorServer = JMXConnectorServerFactory
                    .newJMXConnectorServer(url, null, mbeanServer);
            jmxConnectorServer.start();

            // //建立适配器,用于可以经过浏览器访问MBean
             HtmlAdaptorServer adapter = new HtmlAdaptorServer();
             adapter.setPort(9797);
             register(adapter);
             adapter.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void connect() {
        try {
            JMXServiceURL jmxServiceUrl = new JMXServiceURL(
                    "service:jmx:rmi://localhost/jndi/rmi://" + host + ":"
                            + port + "/jmxrmi");
            JMXConnector connector = JMXConnectorFactory.connect(jmxServiceUrl);
            beanServerConnection = connector.getMBeanServerConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public <T> T getRpcProxy(Class<T> clz) {
        return getRpcProxy(clz, clz);
    }

    @Override
    public <T> T getRpcProxy(Class<T> clz, Class<? extends T> impClz) {
        try {
            ObjectName hwName = new ObjectName(JxmUtli.getObjectName(impClz));
            return JMX.newMXBeanProxy(beanServerConnection, hwName, clz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void close() {
        if (jmxConnectorServer != null) {
            try {
                jmxConnectorServer.stop();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (jxmConnector != null) {
            try {
                jxmConnector.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public Set<ObjectName> getAllRegisterMBean() {
        try {
            ObjectName filterName = new ObjectName("*:*");
            Set<ObjectName> objectNames = beanServerConnection.queryNames(
                    filterName, null);
            return objectNames;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // getter
    public int getPort() {
        return port;
    }

    public String getHost() {
        return host;
    }

    public boolean isStartServer() {
        return startServer;
    }

    public MBeanServer getMbeanServer() {
        return mbeanServer;
    }

    public JMXConnectorServer getJmxConnectorServer() {
        return jmxConnectorServer;
    }

    public JMXConnector getJxmConnector() {
        return jxmConnector;
    }

    public MBeanServerConnection getBeanServerConnection() {
        return beanServerConnection;
    }

}

package testplus2.game;浏览器

public abstract class JxmUtli {ide

public static String getObjectName(Class<?> clz) {
    String name = clz.getName() + ":type=" + clz.getSimpleName();
    return name;
}

}this

package testplus2.jmx;

import java.io.IOException;
import java.io.ObjectInputStream.GetField;
import java.rmi.registry.LocateRegistry;

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import testplus2.game.GamePlus;
import testplus2.game.GamePlusMBean;
import testplus2.game.JmxService;
import testplus2.game.JxmUtli;

public class TestJmxServer {
    private static int port = 5555;

    public static void main(String[] args) {
        test();
    } 
    static void test(){
        JmxService jmxService = new JmxService("localhost",port);
        //注册mbean 实例
        GamePlus gamePlus = new GamePlus();     
        jmxService.register(gamePlus);
        jmxService.start(); 
    }
}
package testplus2.jmx;

import java.util.Set;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;

import testplus2.game.GamePlus;
import testplus2.game.GamePlusMBean;
import testplus2.game.JmxService;

public class JmxClient {

    private static int port = 5555;

    public static void main(String args[]) throws Exception {
        test0();
    }

    private static void test0() throws Exception {

        JmxService jmxService = new JmxService("localhost",port);
        jmxService.connect();
        GamePlusMBean proxy = jmxService.getRpcProxy(GamePlusMBean.class,
                GamePlus.class);
        System.out.println(proxy.getAllConsoleMessage("abc"));

        Set<?> objectNames = jmxService.getAllRegisterMBean();

        for (Object name : objectNames) {
            ObjectName objName = (ObjectName) name;
            System.out
                    .println("    Object Name: " + objName.getCanonicalName());
        }

        
        jmxService.close();
    }

}
相关文章
相关标签/搜索