[编织消息框架][消息服务]jmx
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架,使用的是RMI技术。
比较经典的应用jdk bin目录下 jconsole,jvisualvm
来看下如何使用jconsole简单使用
打开jconsole 菜单->新建连接 打开相应的应用程序,我们拿ServerRMI 接着测试。
选择线程选项RMI应用一共占了11个线程,每次运行线程数不是固定,接着运行ClientRMI
当运行client超过初始化线程数时,每运行一个client会添加一个线程,证明RMI用的是BIO模型
jvisualvm比jconsole强大,建议使用jvisualvm
开发简单的jmx
JMX中常用的概念:
Manageable resource:
可被管理的资源可以是应用程序,设备或者存在的能够被java程序所访问或者包装的实体。通过JMX可以管理这些资源。应用程序能够暴露自己的组件,API或者附加的资源,使得JMX能够管理应用程序。可被管理的资源甚至可以是网络上的设备,例如打印机。可被管理的资源作为一个实体被JMX MBean所管理。
MBean:
MBean(managed bean)是一个Java类,符合JXM specification所规定的命名和继承规范。实例化的MBeans是Java对象,其中所暴露出来的接口(management interface)能够操作和访问manageable resources。这些接口是由MBean的属性和操作组成。
Management application通过访问MBean来访问属性和调用操作。MBean分三种类型:Standard,Dynamic和Model MBean.每一种类型都是针对于特定的manageable resource来使用的。
JMX agent:
JMX agent是一个Java process,能够为管理MBean的集合提供服务,是MBean Server的容器。这些服务可以是建立MBean的之间的关系,动态加载类,监控服务,作为计时器。
Management application
一个management application可以是任何的用户程序,用于和任意多的JMX agent之间建立接口。对于一些设计好的符合JMX技术的management appliction,JMX agents能够建立和该management application的联系,JMX agents也能够建立和那些先前没有考虑用JMX技术的management application建立联系。
传输和安全性
JMX 指定了在 MBeanServer 和 JMX 客户之间通信所使用的协议,协议可以在各种传输机制上运行。可以使用针对本地连接的内置传输,及通过 RMI、socket 或 SSL 的远程传输(可以通过 JMX Connector API 创建新的传输)。
由于我们学习jmx只是为了利用jdk现成的库开发一些性能监控,不作深入了解
@MXBean public interface ITestMBean extends Serializable { public String a(String content); public int b(int a); }
public class TestMBeanServiceImpl implements ITestMBean { private static final long serialVersionUID = -6460154344452562895L; @Override public String a(String content) { System.out.println("call : a" + content); return "server >> " + content; } @Override public int b(int a) { return a+2; } }
1 public class ServerJMX { 2 public final static String NAME = "ITestMBean:name=Test"; 3 public final static String URL = "service:jmx:rmi:///jndi/rmi://localhost:8989/Test"; 4 5 public static void main(String[] args) throws Exception { 6 LocateRegistry.createRegistry(8989); 7 MBeanServer server = MBeanServerFactory.createMBeanServer(); 8 //注册MBean,ObjectName为包装过的域名 格式 [父名称 + :name=子名称] 9 server.registerMBean(new TestMBeanServiceImpl(), new ObjectName(NAME)); 10 11 //添加会话认证 12 Map<String, Object> prop = new HashMap<String, Object>(); 13 prop.put(JMXConnectorServer.AUTHENTICATOR, new JMXAuthenticator() { 14 public Subject authenticate(Object credentials) { 15 if (credentials instanceof String[]) { 16 String[] info = (String[]) credentials; 17 if ("userName".equals(info[0]) && "password".equals(info[1])) { 18 return new Subject(); 19 } 20 } 21 throw new SecurityException("not authicated"); 22 } 23 }); 24 25 //启动JXM Connector Server 26 JMXConnectorServer cserver = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(URL), prop, server); 27 cserver.start(); 28 System.out.println("start....."); 29 } 30 }
1 public class ClientJMX { 2 public static void main(String[] args) throws Exception { 3 //添加连接账号密码 4 Map<String, Object> prop = new HashMap<String, Object>(); 5 prop.put(JMXConnector.CREDENTIALS, new String[] { "userName", "password" }); 6 //创建JMX连接 7 JMXConnector conn = JMXConnectorFactory.connect(new JMXServiceURL(ServerJMX.URL), prop); 8 //生成MEean proxy 跟 rmi 一样使用,不过 jmx传输数据类型太少,本人测试只支持java基本类型 9 ITestMBean obj = JMX.newMBeanProxy(conn.getMBeanServerConnection(), new ObjectName(ServerJMX.NAME), ITestMBean.class); 10 int ret = obj.b(12); 11 System.out.println(ret); 12 } 13 }
可以看出写jmx model 是比较轻松的,只需要加@MBean注解,还能简单控制会话,缺点是传输类型只能是java基本类型,ObjectName 可以使用通配符查询
使用 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); jconsole可以访问但自定义会话认证就无效了,在运行java应用时开启ssl,使用ssl认证
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8050
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.access.file=D:/temp/jmxremote.access
-Dcom.sun.management.jmxremote.password.file=D:/temp/jmxremote.password
提示:jvisualvm没有监控mbean 可以在插件里安装
小结:性能监控使用jmx只需要实现mbean接口同注册,即可使用jconsole查看
作者: | solq |
博客地址: | http://www.cnblogs.com/solq111 |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。 淘宝店: 海豚极货店 QQ群:9547527 ![]() |
如果你热爱生活、热爱编程、热爱吉他。扫一扫加我微信 ![]() |
我的新书《编织消息框架》目前进行中,感谢大家关注! |
![]() |