我的JMX心得 -- Server端
http://blog.csdn.net/derekjiang/article/details/4531952
最近在项目中用到了JMX,以前只是简略的知道JMX是干什么的,却没有深入了解过,当然也没有写过相关的代码,借着这个机会,正好学习一下。Google了n多大侠的相关帖子,对JMX有了一个初步的理解,这里总结出来,希望对大家有用。
关于什么是JMX,这里引用了网上找来的一个介绍:JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理
老实说,看了这个介绍,我还是不太明白,用我们都能理解的大白话来说,JMX是一个框架,它提供了这样一种功能:通过使用JMX,我们可以实时查询应用程序中通过JMX向外公布的相应参数或者是其他应用数据,同时,我们也可以通过JMX来实时的调用应用程序使用JMX向外公布的接口,从而来实现一些操作。
准备工作
JMX是一份规范,SUN依据这个规范在JDK(1.3、1.4、5.0)提供了JMX接口。而根据这个接口的实现则有很多种,比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。在SUN自己也实现了一份,不过在JDK1.4之前,这件JMX实现(一些JAR包)是可选的,你得去它的网站上下载。JDK5.0则内嵌了进来,安装JDK5.0就可以开发基于JMX的代码了。
- package study.test.jmx;
- public interface HelloWorldMBean {
- public String getName();
- public void setName(String name);
- public void printHello();
- public void printHello(String whoName);
- }
package study.test.jmx; public interface HelloWorldMBean { public String getName(); public void setName(String name); public void printHello(); public void printHello(String whoName); }
- package study.test.jmx;
- public class HelloWorld implements HelloWorldMBean {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void printHello() {
- System.out.println("Hello World, " + name);
- }
- public void printHello(String whoName) {
- System.out.println("Hello , " + whoName);
- }
- }
package study.test.jmx; public class HelloWorld implements HelloWorldMBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void printHello() { System.out.println("Hello World, " + name); } public void printHello(String whoName) { System.out.println("Hello , " + whoName); } }
- package study.test.jmx;
- import java.io.IOException;
- import java.rmi.registry.LocateRegistry;
- import java.rmi.registry.Registry;
- import javax.management.InstanceAlreadyExistsException;
- import javax.management.MBeanRegistrationException;
- import javax.management.MBeanServer;
- import javax.management.MBeanServerFactory;
- import javax.management.MalformedObjectNameException;
- import javax.management.NotCompliantMBeanException;
- import javax.management.ObjectName;
- import javax.management.remote.JMXConnectorServer;
- import javax.management.remote.JMXConnectorServerFactory;
- import javax.management.remote.JMXServiceURL;
- import com.sun.jdmk.comm.HtmlAdaptorServer;
- public class HelloWorldAgent {
- public static void main(String[] args) throws MalformedObjectNameException,
- NullPointerException, InstanceAlreadyExistsException,
- MBeanRegistrationException, NotCompliantMBeanException, IOException {
- int rmiPort = 1099;
- String jmxServerName = "TestJMXServer";
- // jdkfolder/bin/rmiregistry.exe 9999
- Registry registry = LocateRegistry.createRegistry(rmiPort);
- MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
- //MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- HtmlAdaptorServer adapter = new HtmlAdaptorServer();
- ObjectName adapterName;
- adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter");
- adapter.setPort(8082);
- adapter.start();
- mbs.registerMBean(adapter, adapterName);
- ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld");
- mbs.registerMBean(new HelloWorld(), objName);
- JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
- System.out.println("JMXServiceURL: " + url.toString());
- JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
- jmxConnServer.start();
- }
- }
package study.test.jmx; import java.io.IOException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; import com.sun.jdmk.comm.HtmlAdaptorServer; public class HelloWorldAgent { public static void main(String[] args) throws MalformedObjectNameException, NullPointerException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, IOException { int rmiPort = 1099; String jmxServerName = "TestJMXServer"; // jdkfolder/bin/rmiregistry.exe 9999 Registry registry = LocateRegistry.createRegistry(rmiPort); MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName); //MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); HtmlAdaptorServer adapter = new HtmlAdaptorServer(); ObjectName adapterName; adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter"); adapter.setPort(8082); adapter.start(); mbs.registerMBean(adapter, adapterName); ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld"); mbs.registerMBean(new HelloWorld(), objName); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName); System.out.println("JMXServiceURL: " + url.toString()); JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); jmxConnServer.start(); } }
比如说上面我们实行的Agent,我们就可以通过http://localhost:8082来对程序进行管理。这里的8082就是htmladapter中设置的端口。
从这张图我们可以看出,我们可以直接从网页上面来改动Name的值,并且也可以直接通过点击来调用相应的方法:printHello
2. 如果大家在尝试写Agent程序时出现connection refused的异常的时候,不用怕,赶紧检查一下你的程序中是不是有这句话:
Registry registry = LocateRegistry.createRegistry(rmiPort);
LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry
或者,你也可以运行 jdkfolder/bin/rmiregistry.exe 9999
其中jdkfolder是你的jdk的安装目录,9999是你要绑定的端口
运行上面的命令和你在代码中添加上面那行code是一样的效果
3. Agent的实现中的32行和33行是两种获取MBeanServer的方式。
MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
这种方式主要用于JDK1.5以前
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
这种方式是JDK1.5引入的。
安全起见,当大家不能确定以后部署的机器上面安装的JDK是1.5以上的版本时,建议按照第一种方式。
4. 绑定需要被管理的类
ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld");
mbs.registerMBean(new HelloWorld(), objName);
这里我们可以看到,首先要给被绑定的类起一个名字,然后把这个名字和被管理的类一起注册到MBeanServer当中。
5. 将服务绑定到固定的URL上
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
jmxConnServer.start();
在start方法被调用后,服务就已经发布成功,我们就可以通过页面或者其他的方式来访问服务
===========
http://damies.iteye.com/blog/51804
前面所有看效果都是通过Html网页来看的。JDK5.0自带了一个jmx客户端,叫jconsole,位于c:\jdk\bin\jconsole.exe。我们来用用这个客户端来连接Mbean Server。
一、vm参数方式
1、还是用第一篇的那个HelloAgent,修改HelloAgent,将第一句:
MBeanServer server = MBeanServerFactory.createMBeanServer();
改为:MBeanServer server = ManagementFactory.getPlatformMBeanServer();
注:ManagementFactory的全路径为:java.lang.management.ManagementFactory
2、修改Eclipse的run选项,把“-Dcom.sun.management.jmxremote=HelloAgent”这一句加入到run选项中
3、运行HelloAgent,然后在Dos窗口输入“jconsole”来启到JConsole
4、单击“连接”
二、RMI方式
还是用jconsole,但方式变了。这里不需要象上面那样修改Eclipse run的vm选项。
1、还是用第一篇的HelloAgent,加上一段代码,启动一个JMXConnectorServer服务
- import javax.management.MBeanServer;
- import javax.management.MBeanServerFactory;
- import javax.management.ObjectName;
- import javax.management.remote.JMXConnectorServer;
- import javax.management.remote.JMXConnectorServerFactory;
- import javax.management.remote.JMXServiceURL;
- import com.sun.jdmk.comm.HtmlAdaptorServer;
- public class HelloAgent {
- public static void main(String args[]) throws Exception {
- MBeanServer server = MBeanServerFactory.createMBeanServer();
- ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
- Hello hello = new Hello();
- server.registerMBean(hello, helloName);
- ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
- HtmlAdaptorServer adapter = new HtmlAdaptorServer();
- server.registerMBean(adapter, adapterName);
- adapter.start();
- System.out.println("start.....");
- // Create an RMI connector and start it
- JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
- JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
- cs.start();
- System.out.println("rmi start.....");
- }
- }
2、在Dos运行一个命令:rmiregistry 9999
3、运行HelloAgent,然后再在dos下运行命令jconsole
输入service:jmx:rmi:///jndi/rmi://localhost:9999/server
三、总结
连接MBeanServer的方式除了Html、JConsole,还有一些第三方的客户端,比较有名的是MC4j,通过这些客户端我们可以很容易去访问MBean。这也就是我们为什么要用JMX的其中一个原因:试想如果我自己搞一套标准,势必要自己开发一个客户端,那会是一个不小的工作量。
我的JMX心得 -- Server端相关推荐
- 详解zabbix安装部署(Server端篇)
Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...
- elasticsearch源码分析之search模块(server端)
elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...
- linux下的c socket编程(4)--server端的继续研究
linux下的C socket编程(4) 延长server的生命周期: 在前面的一个个例子中,server在处理完一个链接之后便会立即结束掉自己,然而这种server并不科学,server因该使能够一 ...
- zabbix 3.2.2 server端(源码包)安装部署 (一)【转】
环境准备: 操作系统 CentOS 6.8 2.6.32-642.11.1.el6.x86_64 zabbix server 172.16.10.150 zabbix agent 172.16.10. ...
- 当微信小程序遇上TensorFlow:Server端实现补充
在前面一篇文章<当微信小程序遇上TensorFlow:Server端实现>中,我们探讨了微信小程序server端的实现.今天在调试微信小程序时才发现一个问题,那就是:微信小程序要求HTTP ...
- 7开启uasp协议_Dubbo-go 源码笔记(一)Server 端开启服务过程
导读:随着微服务架构的流行,许多高性能 rpc 框架应运而生,由阿里开源的 dubbo 框架 go 语言版本的 dubbo-go 也成为了众多开发者不错的选择.本文将介绍 dubbo-go 框架的基本 ...
- Oracle监听器Server端与Client端配置实例
Listener.ora.tnsnames.ora这两个文件常常因为格式问题而不好用,我平时都是配置好了留个备份,以后都是拷贝过去改改就好了!嘿嘿~~~ 因为平时使用linux的时候较多,所以有时还会 ...
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...
- Dubbo-go 源码笔记(一)Server 端开启服务过程
作者 | 李志信 dubbo-go 源码:https://github.com/apache/dubbo-go 导读:随着微服务架构的流行,许多高性能 rpc 框架应运而生,由阿里开源的 dubbo ...
最新文章
- 9月22日培训日记(上)
- [mmu/cache]-ARM MMU的学习笔记-一篇就够了
- 2-2. 控制对文件的访问
- No module named cv2
- 矩阵分析与应用(一)
- 隐藏Ubuntu引导,直接进入系统——变色龙引导Linux,Windows,Mac OS(苹果系统)攻略之二
- kotlin 开发桌面应用_2020-21年Kotlin应用开发十大公司
- 海豚浏览器显示连接服务器失败,海豚浏览器常见问题解答
- #微软MVP分享# WP手机使用记录
- 对于光本身,光走一光年的距离需要多久?————狭义相对论-钟慢效应(时间膨胀)
- CentOS 上 Tomcat 安装及配置
- 套料排版代码python_雕刻机排版下料套料软件,可生成G代码格式和DXF图形、木工下料...
- Linux 性能分析工具汇总
- 四川农业大学自对口计算机,2020四川高考一分一段表出炉!理科696分以上61人,文科645分以上38人!附:最全志愿填报攻略......
- 高效的稳定性测试工具Fastbot的使用
- 学业情绪量表数据的基本处理与SPSS分析思路
- 知乎高赞:假如我有500w存进余额宝,可以每天坐着等吃吗?
- 精选22个Pandas实用函数
- 神谕(oracle) 蝙蝠女,《DC漫画英雄OL》全程新手试玩体验
- css设置背景图片自适应
热门文章
- 【数据结构与算法】之深入解析“有效的数独”的求解思路与算法示例
- Git之深入解析如何将项目迁移到Git
- 5.3 个体条件期望(Individual Conditional Expectation, ICE)
- Codeforces Round #552 (Div. 3) —— A. Restoring Three Numbers
- 2018年第九届省赛C/C++A组第2题——星期一
- 【机器视觉】 dev_close_window算子
- 【Linux系统编程】线程私有数据
- 【Linux】一步一步学Linux——ifup命令(152)
- pano2vr怎么制作漫游_春节7天长假,在云南怎么玩?
- web前端学习文档 电子版_web前端小白系统入门学习