[编织消息框架][消息服务]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;
}
}
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的更多相关文章
- [编织消息框架][消息服务]rmi
RMI(即Remote Method Invoke 远程方法调用) 远程对象: 用于远程客户端调用 必需继承java.rmi.Remote,每个调用方法必须添加java.rmi.RemoteExcep ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- 使用 Spring Cloud Stream 构建消息驱动微服务
相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...
- 消息驱动式微服务:Spring Cloud Stream & RabbitMQ
1. 概述 在本文中,我们将向您介绍Spring Cloud Stream,这是一个用于构建消息驱动的微服务应用程序的框架,这些应用程序由一个常见的消息传递代理(如RabbitMQ.Apache Ka ...
- Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务
什么是Spring Cloud Stream 一个用于构建消息驱动的微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互, ...
- 搭建websocket消息推送服务,必须要考虑的几个问题
近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...
- 优化技术专题-线程间的高性能消息框架-深入浅出Disruptor的使用和原理
前提概要 简单回顾 jdk 里的队列: 阻塞队列: ArrayBlockingQueue主要通过:数组(Object[])+ 计数器(count)+ ReetrantLock的Condition (n ...
- 异步tcp通信——APM.Server 消息推送服务的实现
消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...
随机推荐
- 【2-23】分支语句(switch…case)及循环语句
Switch-case分支语句与if语句作用相同,但需将情况都罗列出比较麻烦所以不常用. 其基本结构是: Switch(一个变量值) { Case 值1:要执行的代码段:break; Case 值2: ...
- ajax三级联动下拉菜单
ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可: 来找一张表: 实现: 中国地域的三级联动:省.市.区: 图: 说一下思路: (1)当用户选择省份的时候触发事件,把当前的省份的id通过 ...
- kali linux /etc/apt/source.list
this list is very important , you can not download what you want like fictx , flash-plugin , vm-tool ...
- html中submit和button的区别(总结) [ 转自欣步同学 ]
html中submit和button的区别(总结) submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证 ...
- windows下的python flask环境搭建
在Windows中搭建flask框架分为如下几步 1. 下载ez_setup.py文件,然后在cmd中执行 链接:http://pan.baidu.com/s/1qXOSeHu 密码:jkbw pyt ...
- 对VC++6.0爱得深沉(三)静态库的制作与使用
[创建] 1)建立新工程(win32静态库) (2)加入.h文件于.cpp文件如图. 3)编译-构建,生成.lib文件 [使用] 1)新建普通控制台程序 2)打开项目文件夹与刚才生成的库文件夹 3)方 ...
- geoR文档翻译
说来惭愧,很久没有更新自己的博客了.期间个人生活经历了很多变故,心理上的打击尤甚.加之没有取得好的科研成果,痛定思痛,还是下苦功夫多多学习. 最近对比验证各种方法的插值精度,用到了R语言地统计学包,由 ...
- Node.js编程之异步
异步操作 Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务.这导致Node大量采用异步操作(asynchronous opertion),即任务不是马上执 ...
- unity插件开发——一个例子:简单的svn集成
在unity开发过程中,通常我们习惯性地在Windows操作系统下使用svn进行版本管理,而每次提交更新,都需要回到文件夹下的这种操作让人无法忍受.是不是可以集成svn到unity中呢?查了一圈uni ...
- 【C#】组件分享:FormDragger-窗体拖拽器
适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...