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;
}
}
 public class ServerJMX {
public final static String NAME = "ITestMBean:name=Test";
public final static String URL = "service:jmx:rmi:///jndi/rmi://localhost:8989/Test"; public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(8989);
MBeanServer server = MBeanServerFactory.createMBeanServer();
//注册MBean,ObjectName为包装过的域名 格式 [父名称 + :name=子名称]
server.registerMBean(new TestMBeanServiceImpl(), new ObjectName(NAME)); //添加会话认证
Map<String, Object> prop = new HashMap<String, Object>();
prop.put(JMXConnectorServer.AUTHENTICATOR, new JMXAuthenticator() {
public Subject authenticate(Object credentials) {
if (credentials instanceof String[]) {
String[] info = (String[]) credentials;
if ("userName".equals(info[0]) && "password".equals(info[1])) {
return new Subject();
}
}
throw new SecurityException("not authicated");
}
}); //启动JXM Connector Server
JMXConnectorServer cserver = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(URL), prop, server);
cserver.start();
System.out.println("start.....");
}
}
 public class ClientJMX {
public static void main(String[] args) throws Exception {
//添加连接账号密码
Map<String, Object> prop = new HashMap<String, Object>();
prop.put(JMXConnector.CREDENTIALS, new String[] { "userName", "password" });
//创建JMX连接
JMXConnector conn = JMXConnectorFactory.connect(new JMXServiceURL(ServerJMX.URL), prop);
//生成MEean proxy 跟 rmi 一样使用,不过 jmx传输数据类型太少,本人测试只支持java基本类型
ITestMBean obj = JMX.newMBeanProxy(conn.getMBeanServerConnection(), new ObjectName(ServerJMX.NAME), ITestMBean.class);
int ret = obj.b(12);
System.out.println(ret);
}
}

可以看出写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查看

[编织消息框架][消息服务]jmx的更多相关文章

  1. [编织消息框架][消息服务]rmi

    RMI(即Remote Method Invoke 远程方法调用) 远程对象: 用于远程客户端调用 必需继承java.rmi.Remote,每个调用方法必须添加java.rmi.RemoteExcep ...

  2. 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  3. [编织消息框架][netty源码分析]2 eventLoop

    eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...

  4. 使用 Spring Cloud Stream 构建消息驱动微服务

    相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...

  5. 消息驱动式微服务:Spring Cloud Stream & RabbitMQ

    1. 概述 在本文中,我们将向您介绍Spring Cloud Stream,这是一个用于构建消息驱动的微服务应用程序的框架,这些应用程序由一个常见的消息传递代理(如RabbitMQ.Apache Ka ...

  6. Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务

    什么是Spring Cloud Stream 一个用于构建消息驱动的微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互, ...

  7. 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...

  8. 优化技术专题-线程间的高性能消息框架-深入浅出Disruptor的使用和原理

    前提概要 简单回顾 jdk 里的队列: 阻塞队列: ArrayBlockingQueue主要通过:数组(Object[])+ 计数器(count)+ ReetrantLock的Condition (n ...

  9. 异步tcp通信——APM.Server 消息推送服务的实现

    消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...

随机推荐

  1. APICloud使用

    APICloud-APP开发平台 [网址:]http://www.apicloud.com/ APICloud studio 下载 打开网址,找到开发者社区->文档->下载->开发工 ...

  2. Isomorphic Strings leetcode

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  3. jenkins-Couldn't find any revision to build. Verify the repository and branch configuration for this job

    参考解决方法: https://issues.jenkins-ci.org/browse/JENKINS-20502 原因分析:jenkins无法准确识别revision 操作方法: 在 branch ...

  4. 记录Winform开发过程中遇到的情况

    前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念. 一.CSKIN美化框架的使用 刚开始做的时候,发 ...

  5. Postman使用教程——调试网络接口的凶器

    postman是谷歌浏览器的一个插件,干什么用的呢?跟题目一样,就是用来调试网络接口的.在我们程序猿做程序的时候,如果做网络应用的开发,比如一些B/S.C/S,我们总会给别人一些网络接口,也会使用别人 ...

  6. eclipse和myeclipse设置默认编码格式为UTF-8

    1:jsp页面设置默认为utf-8 以eclipse为例 2:java界面设置: Window->Preferences->General->Workspace 面板Text fil ...

  7. node.js 基础知识之 querystring.stringify querystring.escape

    序列化   1.  querystring.stringify({name:'chenshuai',ago:21,job:"web"})    'name=chenshuai&am ...

  8. RAC OCR盘故障导致的集群重启恢复

    一.事故说明 最近出现了一次OCR盘的故障导致Oracle集群件宕机的事故,后以独占模式启动集群,并使用ocr备份恢复了OCR文件以及重新设置了vote disk,然后关闭集群,重启成功. 因此在此处 ...

  9. kvm的sshd起不来

    同事不知道在一台KVM虚拟机执行了chmod -R 777 /  将更目录中的所有文件的权限都改为777,重启该虚拟机之后发现该虚拟机登不上去了,来找我,我尝试重启了几次虚拟机之后,发现总是可以被pi ...

  10. Pycharm集成PyQt4并使用