[编织消息框架][消息服务]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等技术实现,消息对列可使用 ...
随机推荐
- 巧用*_his表记录操作历史
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...
- lucene倒排索引缓冲池的细节
倒排索引要存哪些信息 提到倒排索引,第一感觉是词到文档列表的映射,实际上,倒排索引需要存储的信息不止词和文档列表.为了使用余弦相似度计算搜索词和文档的相似度,需要计算文档中每个词的TF-IDF值, ...
- 【Unity优化】构建一个拒绝GC的List
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 上篇文章<[Unity优化]Unity中究竟能不能使用foreach?> ...
- 20170305Meetup Git、heroku drop db
Rails中,给link_to添加上action和class样式,内部文本 <%= link_to product_path(product),{ :controller => 'cont ...
- 关于label和input对齐的那些事
input文本和label对齐 默认状态下,也就是下面这样, 文字和input是居中的. <div> <label>我是中国人</label> <input ...
- 3450: Tyvj1952 Easy
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 198[Submit][Status] ...
- 3018: [Usaco2012 Nov]Distant Pastures
3018: [Usaco2012 Nov]Distant Pastures Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 43 Solved: 20[ ...
- 循环单词 java
链接:https://www.nowcoder.com/questionTerminal/9d5fbe7750a34d0b91c73943f93b2d7d来源:牛客网如果一个单词通过循环右移获得的单词 ...
- 享受release版本发布的好处的同时也应该警惕release可能给你引入一些莫名其妙的大bug
一般我们发布项目的时候通常都会采用release版本,因为release会在jit层面对我们的il代码进行了优化,比如在迭代和内存操作的性能提升方面,废话不多说, 我先用一个简单的“冒泡排序”体验下r ...
- Java中static的特点
前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...