jmx的运用场景:客户端调用服务器端的方法。服务端做服务。从这一点来讲:jmx可用于分布式项目。将服务分布在不同的服务器上,形成分布式项目。
先从小demo入手,理解jmx是怎么玩的。
1.准备好材料:
1.需要一个MBean接口,并且实现这个接口。
2.一个服务端,用来将接口注册进去。
3.一个客户端,用来调用接口中的方法。
从上面我们可以分析出:
1.Mbean接口和实现,与服务端放在一起。
2.客户端需要Mbean接口。而不需要实现。
理解了这两点:我们可以建立两个项目。一个jmxServer,一个jmxClient.
jmxServer项目:
一个MBean接口
public interface HelloMBean { public String getName(); public void setName(String name); // management operations public void print(); }实现这个接口: public class Hello implements HelloMBean{ private String name = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } public void print() { System.out.println("Hello, " + name + "!!" ); } }然后是服务,首先是开个端口,然后需要将接口注册进去:
public class JmxServer { private final AtomicBoolean runningFlag = new AtomicBoolean(true); /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { try { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); String addr = "192.168.10.38:1234";//本机的话ip地址可以使用localhost或者127.0.0.1 JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://" + addr + "/jndi/rmi://" + addr + "/jmxrmi"); Map<String, Object> jmxEnvironment = new HashMap<String, Object>(); jmxEnvironment.put("jmx.remote.credentials", new String[] { "saf", "asswrd" }); InetAddress ipInterface = InetAddress.getByName("192.168.10.38"); RMISocketFactory rmiFactory = RMISocketFactory.getDefaultSocketFactory(); //new AnchorSocketFactory(ipInterface,"false"); LocateRegistry.createRegistry(1234, null, rmiFactory); // 這個是必須的,否則報 no such object in table之類是異常!!!! 花了相當長時間才發現這點 jmxEnvironment.put( RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, rmiFactory); // 需要认证则这么写: // JMXAuthenticator auth = createJMXAuthenticator(); // jmxEnvironment.put(JMXConnectorServer.AUTHENTICATOR, auth); JMXConnectorServer connector = JMXConnectorServerFactory .newJMXConnectorServer(address, jmxEnvironment, ManagementFactory.getPlatformMBeanServer()); HelloMBean mbean = new Hello(); ObjectName testMBeanName = new ObjectName( "helloMBean:name=helloMBean"); testMBeanName = new ObjectName("helloMBeanDomain", "type", "HelloMBean"); mbs.registerMBean(mbean, testMBeanName); connector.start(); } catch (Exception e) { e.printStackTrace(); } } private JMXAuthenticator createJMXAuthenticator() { return new JMXAuthenticator() { public Subject authenticate(Object credentials) { String[] sCredentials = (String[]) credentials; if (null == sCredentials || sCredentials.length != 2) { throw new SecurityException("Authentication failed!"); } String userName = sCredentials[0]; String pValue = sCredentials[1]; if ("saf".equals(userName) && "asswrd".equals(pValue)) { Set principals = new HashSet(); principals.add(new JMXPrincipal(userName)); return new Subject(true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET); } throw new SecurityException("Authentication failed!"); } }; } } 服务端搞定。
接下来是客户端:
客户端需要MBean接口,这个接口是跟服务端一致的。
public interface HelloMBean { public String getName(); public void setName(String name); // management operations public void print(); } 然后是连接上IP和端口,拿到注册的bean,然后调用其中的方法。然后服务端就会服务了。 public class JmxClient { public static void main(String[] args) throws InterruptedException { ObjectName hello_name = null; try { hello_name = new ObjectName("helloMBeanDomain", "type", "HelloMBean"); System.out.println("\tOBJECT NAME = " + hello_name); // service:jmx:rmi://%s:%d/jndi/rmi://%s:%d/jmxrmi String addr = "192.168.10.38:1234"; JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://" + addr + "/jndi/rmi://" + addr + "/jmxrmi"); System.out.println("JmxRemote.main()1"); Map<String, Object> jmxEnvironment = new HashMap<String, Object>(); // jmxEnvironment.put("jmx.remote.credentials", new String[] { // "saf", "asswrd"}); JMXConnector connector = JMXConnectorFactory.connect(address, jmxEnvironment); System.out.println("JmxRemote.main()2"); MBeanServerConnection mbs = connector.getMBeanServerConnection(); System.out.println("JmxRemote.main()3"); ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy( mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); System.out .println(" getThreadCount " + threadBean.getThreadCount()); MBeanServerConnection connection = connector .getMBeanServerConnection(); HelloMBean helloMBean = JMX.newMXBeanProxy(connection, hello_name, HelloMBean.class); System.out.println("aaaaaaaa " + helloMBean); helloMBean.setName("LKKKKKKK ddd basdf"); helloMBean.print(); connector.close(); } catch (Exception e) { e.printStackTrace(); return; } } } jmx的简单例子就是这样了。完毕!!!!!!
