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();
    }

}
相關文章
相關標籤/搜索