zoukankan      html  css  js  c++  java
  • jmx

    jmx是java程序之间互为通信,rpc调用风格.应用场景:集群环境内快速度部署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 {

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

    }

    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();
    	}
    
    }
    
  • 相关阅读:
    Loadrunner:场景运行较长时间后报错:Message id [-17999] was not saved
    JMeter学习(三十二)属性和变量
    LoadRunner参数化MySQL
    Linux下安装使用NMON监控、分析系统性能
    使用Loadrunner进行http接口压力测试
    Windows远程桌面连接Ubuntu 14.04
    oracle转Mysql中,varchar2(10)和number应该转换为什么类型?
    centos下pip安装mysql_python
    JMeter中返回Json数据的处理方法
    如何使用AutoIT完成单机测试
  • 原文地址:https://www.cnblogs.com/solq/p/4604197.html
Copyright © 2011-2022 走看看