[编织消息框架][消息服务]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查看

posted @ 2017-04-21 15:09  solq321  阅读(356)  评论(0编辑  收藏  举报