zoukankan      html  css  js  c++  java
  • [编织消息框架][消息服务]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查看

  • 相关阅读:
    matlab软件-了解
    C# 自定义异常demo
    C#二进制对象copy
    asp.net 缓存依赖demo
    权限管理细粒度问题
    三层架构中的异常处理二
    如何解决复杂问题——结构化思维方式
    入职新公司如何熟悉项目
    专业工具使用与复杂大型项目设计管理
    十分钟学会 tmux
  • 原文地址:https://www.cnblogs.com/solq111/p/6742817.html
Copyright © 2011-2022 走看看