之前有了解过JMX,工作中有时候也在用,但是啥东西不系统的学一下,你的内心是空虚的,因此这两天整了整。就放些代码吧,和JMX规范的架构图把。
JMX 架构图:
package com.blackbeans.example.mbeans; /** * Mbean接口 * @author blackbeans * */ public interface GunMBean { public void aimAndShoot(String[] targetName); }
package com.blackbeans.example.mbeans; import javax.management.AttributeChangeNotification; import javax.management.NotificationBroadcasterSupport; /** * 实现的Mbean,即所谓的JMX Resources * * @author blackbeans * */ public class Gun extends NotificationBroadcasterSupport implements GunMBean { private String gunModel; public Gun(String gunModel) { this.gunModel = gunModel; } @Override public void aimAndShoot(String[] targetNames){ for(String targetName : targetNames ){ System.out.println(gunModel + "aim at "+ targetName +" !"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(gunModel + " fire !"); } AttributeChangeNotification notification = new AttributeChangeNotification(this, 0, 0L, "Gun shot!", null, null, null, null); sendNotification(notification); } }
为了监控MBean的值变,JMX 的Agent Level有提供基于java 事件的Notification机制可以通知其他的JMX当前的资源发生了变更。JMX 的Agent Level提供了Monitor服务并通知所有的Listener。
package com.blackbeans.example.mbeans; import javax.management.Notification; import javax.management.NotificationListener; public class GunFiredNotificationListener implements NotificationListener { @Override public void handleNotification(Notification notification, Object handback) { System.out.println("notifyInfo:\t"+notification+"\n handback:\t"+handback); } }
MBServer
package com.blackbeans.example.mbeans; import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.MalformedURLException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; public class MyMBeanServer { private MBeanServer mbServer; public MyMBeanServer() { this.mbServer = ManagementFactory.getPlatformMBeanServer(); try { Registry reg = LocateRegistry.createRegistry(9999); for(String bind : reg.list()){ System.out.println(bind); } JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.1.101:9999/MBServer"); JMXConnectorServer connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbServer); connector.start(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void registerMBean(String objectName,Object obj) { ObjectName objName = null; try { objName = new ObjectName(objectName); this.mbServer.registerMBean(obj, objName); this.mbServer.addNotificationListener(objName, new GunFiredNotificationListener(), null, null); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { Gun gun = new Gun("AK-47"); MyMBeanServer myServer = new MyMBeanServer(); myServer.registerMBean(gun.getClass().getPackage().getName() + ":name="+gun.getClass().getSimpleName(), gun); Thread.sleep(100000); } }
MBeanClient
package com.blackbeans.example.mbeans; import java.io.IOException; import java.net.MalformedURLException; import javax.management.InstanceNotFoundException; import javax.management.MBeanException; import javax.management.MBeanServerConnection; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.ReflectionException; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class MyMBeanClient{ private MBeanServerConnection connection; public MyMBeanClient(String jmxUrl) { JMXServiceURL url = null; try { url = new JMXServiceURL(jmxUrl); JMXConnector connector = JMXConnectorFactory.connect(url); connector.connect(); this.connection = connector.getMBeanServerConnection(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void invokeMethod(ObjectName objName,String opName ,Object[] paras,String[] signature) { try { this.connection.invoke(objName, opName, paras, signature); } catch (InstanceNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MBeanException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ReflectionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { String[] gunTypes = new String[]{"AK-47","M16"}; MyMBeanClient client = new MyMBeanClient("service:jmx:rmi:///jndi/rmi://192.168.1.101:9999/MBServer"); try { ObjectName objName = new ObjectName("com.blackbeans.example.mbeans:name=Gun"); Object[] parameters = new Object[]{gunTypes}; String[] signatures = new String[]{"[Ljava.lang.String;"}; client.invokeMethod(objName, "aimAndShoot", parameters, signatures); } catch (MalformedObjectNameException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
我的例子使用的JMX的RMI方式调用,当然你也可以选择使用本地方式或者使用Sun的 HtmlJmxAdapter 来完成JMX调用或者不用客户端直接使用jconsol连接上去调用即可.
reference:
http://java.sun.com/developer/technicalArticles/J2SE/jmx.html
相关推荐
jmx简单实例装有jms-1.1.jar、jmxri-1.2.1.jar、jmxtools-1.2.1.jar包,完整项目能跑,附带简单使用说明...
JMX实战 书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些...
jmx的简单介绍和使用,包含一些简单的代码示例,看完基本能了解jmx并使用。
jmx快速上手 jmx快速上手 jmx快速上手 jmx快速上手
Jmx 简单实例,html格式Jmx控制台
Jmx简单应用,http页面方式,vm参数方式,rmi方式
为什么JMX那么受欢迎,JMX到底有那些优势只得人们去学习和理解,本文从JMX的基本架构、hellowold jmx以及spring对JMX的支持讲起,希望大家能通过本文对JMX有个基础的认识,并能通过本文为今后学习JMX打个基础
Fiddler导出jmx文件,解决Fiddler导出文件中 没有jmx文件选项,各个版本fiddler都适用
入门好例子,希望对大家有用,eclipse下导入直接可以运行。
Description Resource Path Location Type Missing artifact com.sun.jmx:jmxri:jar:1.2.1 pom.xml /eshop-storm line 2 Maven Dependency Problem
jmx配置
JBoss JMX实现架构 JBoss JMX实现架构
JMX小例子以及介绍 JMX小例子以及介绍 JMX小例子以及介绍
catalina-jmx-remote.jar放到tomcat/lib目录下 如果是windows版本,编辑TOMCAT_HOME/bin/catalina.bat,在开头加入下面几行: set CATALINA_OPTS=%CATALINA_OPTS% -Djava.rmi.server.hostname=JMX_HOST set CATALINA...
java实现Jmx实例,jmxdemo项目源码下载
JMX与JMS的概念
JMX一步一步来,从最基本的应用开始入手,快速应用开发。
Hbase和Hadoop JMX监控实战
jmx和jmx在glassfish中的应用
有关JMX学习的一些文档,对初学JMX的朋友有帮助.