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

}
原文地址:https://www.cnblogs.com/solq/p/4604197.html