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