记忆中唯独就wwWwww.hnhjbw.commxcom缺失了,调整入口的www.hnhjbw.commx那一段

博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)开源框架是如何通过JMX来做监控的(一) - JMX简介和Standard MBean
时间: 13:38:41
&&&& 阅读:283
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 相关文章目录:
&&& 开源框架是如何通过JMX来做监控的(二) - Druid连接池的监控
&&& 相信很多做Java开发的同学都使用过JDK自带的 jconsole 或者 jvisualvm 监控过JVM的运行情况,但不知道有没有留意过它们会有一个MBean的功能/标签,通过MBean可以看到在JVM中运行的组件的一些属性和操作
&&& 例如,可以看到Tomcat 8080端口Connector的请求连接池信息,Druid数据库连接池的activeCount连接数以及连接池配置信息,这些开源框架或中间件都是通过JMX的方式将自己的一些管理和监控信息暴露给我们
&&& JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。
&&& 下面简单介绍一下JMX和其最简单的Standard MBean,以及常用实例,之后的文章中会分析Druid数据库连接池等开源框架是如何通过JMX做监控的,没准在我们的程序中也可以用到。
&&& 以下是本文的目录大纲:
&&& 若有不正之处请多多谅解,欢迎批评指正、互相讨论。
&&& 请尊重作者劳动成果,转载请标明原文链接:
一、JMX架构及基本概念
从上面的架构图可以看到JMX主要分三层,分别是:
1、设备层(Instrumentation Level)
主要定义了信息模型。在JMX中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。该层还定义了通知机制以及一些辅助元数据类。
设备层其实就是和被管设备通信的模块,对于上层的管理者来说,Instrumentation 就是设备,具体设备如何通信,是采用SNMP,还是采用ICMP,是MBean的事情。
该层定义了如何实现JMX管理资源的规范。一个JMX管理资源可以是一个Java应用、一个服务或一个设备,它们可以用Java开发,或者至少能用Java进行包装,并且能被置入JMX框架中,从而成为JMX的一个管理构件(Managed Bean),简称MBean。管理构件可以是标准的,也可以是动态的,标准的管理构件遵从JavaBeans构件的设计模式;动态的管理构件遵从特定的接口,提供了更大的灵活性。
在JMX规范中,管理构件定义如下:它是一个能代表管理资源的Java对象,遵从一定的设计模式,还需实现该规范定义的特定的接口。该定义了保证了所有的管理构件以一种标准的方式来表示被管理资源。
管理接口就是被管理资源暴露出的一些信息,通过对这些信息的修改就能控制被管理资源。一个管理构件的管理接口包括:
&&& 1) 能被接触的属性值
&&& 2) 能够执行的操作
&&& 3) 能发出的通知事件
&&& 4) 管理构件的构建器
本文着重介绍最基本也是用的最多的Standard Mbean,至于其它的如Dynamic MBean、Model MBean暂时不介绍,请参考本文最后资料中的文章。
Standard MBean是最简单的MBean,它管理的资源必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。
2、代理层(Agent Level)
Agent层 用来管理相应的资源,并且为远端用户提供访问的接口。Agent层构建在设备层之上,并且使用并管理设备层内部描述的组件。Agent层主要定义了各种服务以及通信模型。该层的核心是 MBeanServer,所有的MBean都要向它注册,才能被管理。注册在MBeanServer上的MBean并不直接和远程应用程序进行通信,他们通过 协议适配器(Adapter) 和 连接器(Connector) 进行通信。通常Agent由一个MBeanServer和多个系统服务组成。JMX Agent并不关心它所管理的资源是什么。
3、分布服务层(Distributed Service Level)
分布服务层关心Agent如何被远端用户访问的细节。它定义了一系列用来访问Agent的接口和组件,包括Adapter和Connector的描述。
二、Standard MBean
Standard MBean的设计和实现是最简单的,它们的管理接口通过方法名来描述。Standard MBean的实现依靠一组命名规则。这些命名规则定义了属性和操作。
一个只读属性在MBean中只有get方法,既有get又有set方法表示是一个可读写的属性。
为了实现Standard MBean,必须遵循一套继承规范。必须为每一个MBean定义一个接口,而且这个接口的名字必须是其被管理的资源的对象类的名称后面加上&MBean&,之后把它们注册到MBeanServer中就可以了
MBean接口:
public interface HelloMBean {
public String getName();
public void setName(String name);
public String printHello();
public String printHello(String whoName);
接下来是真正的资源对象,因为命名规范的限制,因此对象名称必须为Hello
public class Hello implements HelloMBean {
public String getName() {
public void setName(String name) {
this.name =
public String printHello() {
return "Hello "+
public String printHello(String whoName) {
return "Hello
接下来创建一个HelloMBean,并将其注册到MBeanServer:
public class HelloAgent {
public static void main(String[] args) throws Exception {
// 首先建立一个MBeanServer,MBeanServer用来管理我们的MBean,通常是通过MBeanServer来获取我们MBean的信息
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String domainName = "MyMBean";
// 为MBean(下面的new Hello())创建ObjectName实例
ObjectName helloName = new ObjectName(domainName+":name=HelloWorld");
// 将new Hello()这个对象注册到MBeanServer上去
server.registerMBean(new Hello(),helloName);
三、通过RMI方式连接JMX Server
继续上面的HelloMBean、HelloAgent,我们可以通过RMI的方式注册URL来提供客户端连接,这样就可以通过 jvisualvm 或者 自己写的Java程序作为JMX的客户端来管理MBean
import java.lang.management.ManagementF
import java.rmi.registry.LocateR
import java.rmi.registry.R
import javax.management.MBeanS
import javax.management.ObjectN
import javax.management.remote.JMXConnectorS
import javax.management.remote.JMXConnectorServerF
import javax.management.remote.JMXServiceURL;
public class HelloAgent {
public static void main(String[] args) throws Exception {
//create mbean server
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
//create object name
ObjectName objectName = new ObjectName("jmxBean:name=hello");
//create mbean and register mbean
server.registerMBean(new Hello(), objectName);
* JMXConnectorServer service
//这句话非常重要,不能缺少!注册一个端口,绑定url后,客户端就可以使用rmi通过url方式来连接JMXConnectorServer
Registry registry = LocateRegistry.createRegistry(1099);
//构造JMXServiceURL
JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
//创建JMXConnectorServer
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, server);
cs.start();
在创建JMXConnectorServer时创建的JMXServiceURL比较复杂,但其实其完整版为:
service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi
蓝色部分可以省略掉
service:jmx:&&& 这个是JMX URL的标准前缀,所有的JMX URL都必须以该字符串开头,否则会抛MalformedURLException
rmi:&&& 这个是jmx connector server的传输协议,在这个url中是使用rmi来进行传输的
localhost:0&&& 这个是jmx connector server的IP和端口,也就是真正提供服务的host和端口,可以忽略,那么会在运行期间随意绑定一个端口提供服务
jndi/rmi://localhost:1099/jmxrmi&&& 这个是jmx connector server的路径,具体含义取决于前面的传输协议。比如该URL中这串字符串就代表着该jmx connector server的stub是使用 jndi api 绑定在 rmi://localhost:1099/jmxrmi 这个地址
如果在服务器端,我们用该URL创建一个jmx connector server,则大概流程如下:
1、将jmx connect server内部的server对象的rmi stub export到本地的一个随机端口(也可以自己指定),接收外部连接
2、通过jndi api将该stub绑定在rmi://localhost:6000/jmxrmi这个地址上,这需要在本地的1099端口上运行着一个rmiregistry,如果不存在则会抛出异常
如果在客户端,我们通过该URL创建一个connector,则大概流程如下:
1、访问1099端口,通过jndi api到rmi://localhost:1099/jmxrmi这个地址取回stub
2、stub中已经包含了真实服务器的IP和端口,所以可以直接根据该stub连接到真实的服务器
下面具体展示一段客户端代码,可以获取jmx connector,并展示HelloMBean的一些信息,属性,及调用其方法
import java.util.I
import java.util.S
import javax.management.A
import javax.management.MBeanI
import javax.management.MBeanServerC
import javax.management.MBeanServerInvocationH
import javax.management.ObjectI
import javax.management.ObjectN
import javax.management.remote.JMXC
import javax.management.remote.JMXConnectorF
import javax.management.remote.JMXServiceURL;
public class JMXClient {
public static void main(String[] args) throws Exception {
//connect JMX
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url,null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("jmxBean:name=hello");
//print domains
System.out.println("Domains:---------------");
String domains[] = mbsc.getDomains();
for (int i = 0; i & domains. i++) {
System.out.println("Domain[" + i +"] = " + domains[i]);
System.out.println();
//MBean count
System.out.println("MBean count:---------------");
System.out.println("MBean count = " + mbsc.getMBeanCount());
System.out.println();
//process attribute
System.out.println("process attribute:---------------");
mbsc.setAttribute(mbeanName, new Attribute("Name", "newName")); //set value
System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name")); //get value
System.out.println();
//invoke via proxy
System.out.println("invoke via proxy:---------------");
HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
System.out.println(proxy.printHello());
System.out.println(proxy.printHello("zhangsan"));
System.out.println();
//invoke via rmi
System.out.println("invoke via rmi:---------------");
System.out.println(mbsc.invoke(mbeanName, "printHello", null, null));
System.out.println(mbsc.invoke(mbeanName, "printHello", new Object[] { "lisi" }, new String[] { String.class.getName() }));
System.out.println();
//get mbean information
System.out.println("get mbean information:---------------");
MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
System.out.println("Hello Class:" + info.getClassName());
System.out.println("Hello Attribute:" + info.getAttributes()[0].getName());
System.out.println("Hello Operation:" + info.getOperations()[0].getName());
System.out.println();
//ObjectName of MBean
System.out.println("ObjectName of MBean:---------------");
Set set = mbsc.queryMBeans(null, null);
for (Iterator it = set.iterator(); it.hasNext();) {
ObjectInstance oi = (ObjectInstance)it.next();
System.out.println(oi.getObjectName());
jmxc.close();
例子中我们可以get/set HelloMBean的Name属性,可以通过先获取代理和直接RMI的方式调用HelloMbean的printHello()方法等。
这样我们就有了一个完整的JMX server、client的例子,很多开源框架(如一些数据库连接池DBCP2、Druid)都实现了JMX来达到对其自身的监控,虽然这不是唯一的方法,也可以通过其它方式提供监控查询接口,但由于JMX是sun提出的通用标准,故大家纷纷响应实现。所以当我们使用这些开源框架并希望对其运行状况做一些管理监控时,可以采用JMX的方式获取其暴露出的MBean相关属性和方法。之后会分析一些Druid是如何通过JMX的方式做管理监控的。
四、通过VisualVM连接JMX Server
打开JDK自带的VisualVM,由于本例是本地localhost的JMX server,那么在左侧栏&本地&上右键,创建JMX连接
点击后只需填写本地的RMIRegistry注册的端口1099即可,当然也可以填写完整的URL:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
连接成功后,就可以看到HelloMBean以及其提供的属性和操作,还可以调用printHello()方法
参考资料:
&&& 标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文地址:http://www.cnblogs.com/trust-freedom/p/6842332.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!回忆中的老电影 - 歌单 - 网易云音乐
回忆中的老电影
播放:15次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:
违法和不良信息举报电话:6
举报邮箱:当前位置: →
→ JMX1. 什么是JMXJDK中的JMX实现
JMX1. 什么是JMXJDK中的JMX实现
& 作者及来源: leno.lix - 博客园 &
&收藏到→_→:
摘要: [转载]【JMX】1. 什么是JMX、JDK中的JMX实现
"JMX1. 什么是JMXJDK中的JMX实现"::
转载声明:http://blog.马开东/vking_wang/article/details/8668743
jmx & & & &即 java management extensions&& java管理扩展,是一个为程序植入管理功能的框架mbean & 即 managed beans & & & & & & & & & & & & 被管理的beans
举一个实例:在一个中常常会有一些配置信息,比如服务的ip地址,端口号什么的,那么如何来写这些代码呢?
程序初哥一般是写死在程序里,到要改变时就去改程序,然后再编译发布;
程序熟手则一般把这些信息写在一个配置文件里(java一般都是*.properties文件),到要改变时只要改配置文件,但还是重新启动,以便读取配置文件里的新值;
程序好手则会写一个段代码,把配置值缓存起来,在读值的时候,先看看配置文件有没有更动。如有更改则重读一遍,否则从缓存里读取值
程序高手则懂得取物为我所用,用jmx!把配置属性集中在一个类,然后写一个叫mbean的东东,再配置一下就轻松搞定了。而且jmx自动提供了一个web页面来给你来改变这些配置信息。
jmx是一份规范,sun依据这个规范在jdk提供了jmx接口。而根据这个接口的实现则有很多种,比如weblogic的jmx实现、mx4j、jboss的jmx实现。
&&&&&&& jmx是一种java的正式规范,它主要目的是让程序且有被管理的功能,那么怎么理解所谓的&被管理&呢?试想你开发了一个(如web网站),它是在24小时不简断运行的,那么你可能会想要&监控&这个的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想&配置&这个,比如现在访问人数比较多,你想把数据连接池设置得大一些。
  当然,你也许会专门为这些管理来开发,但如果你借助jmx,则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面,已经有通用的jmx管理,如mc4j,或者是用一般都附带提供的html网页来管理,你要做的仅仅是将自己要被管理和监控类的按照jmx规范修改一下即可。
  中间件weblogic的管理页面就是基于jmx开发的,而jboss则整个都基于jmx构架。
jdk中的jmx示例
1)创建一个需要被管理的类
public&class&hello&implements&hellombean&{&&&&&
&&&&private&string&&&&&&&&
&&&&public&string&getname()&{&&&&&
&&&&&&&&return&&&&&&
&&&&}&&&&&&&
&&&&public&void&setname(string&name)&{&&&&&
&&&&&&&&this.name&=&&&&&&
&&&&}&&&&&&&
&&&&public&void&printhello()&{&&&&&
&&&&&&&&system.out.println("hello&world,&"&+&name);&&&&&
&&&&}&&&&&&&
&&&&public&void&printhello(string&whoname)&{&&&&&
&&&&&&&&system.out.println("hello&,&"&+&whoname);&&&&&
&&&&}&&&&&
注意必须继承hellobean,否则报错:
exception in thread "main" javax.management.notcompliantmbeanexception:&&& &mbean class jmx.jdk.hello does not implement dynamicmbean,&&& &neither follows the standard mbean conventions&
2)创建mbean
public&interface&hellombean&{&&&&&
&&&&public&string&getname();&&&&&&
&&&&public&void&setname(string&name);&&&&&
&&&&public&void&printhello();&&&&&&&
&&&&public&void&printhello(string&whoname);&&&&&
包含在mbean中 都将是可以被管理的。
mbean起名是有规范的,就是原类名后加上mbean字样。
3)创建agent
import&java.lang.management.&&
import&javax.management.&&
import&javax.management.&&
import&com.sun.jdmk.comm.&&
public&class&helloagent&{&&&&&
&&&&public&static&void&main(string[]&args)&throws&exception&{&&&&&
&&&&&&&&&&
&&&&&&&&mbeanserver&server&=&mbeanserverfactory.creatembeanserver();&&&&&
&&&&&&&&objectname&helloname&=&new&objectname("alpha:name=helloworld");&&&&
&&&&&&&&hello&hello=new&hello();&&&&&
&&&&&&&&&&
&&&&&&&&server.re termbean(hello,&helloname);&&&&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&objectname&adaptername&=&new&objectname("helloagent:name=htmladapter,port=8082");&&&&&
&&&&&&&&htmladaptorserver&adapter&=&new&htmladaptorserver();&&&&&
&&&&&&&&server.re termbean(adapter,&adaptername);&&&&&
&&&&&&&&adapter.start();&&&&&
&&&&&&&&system.out.println("start.....");&&&&
&&&&}&&&&&
注意这里引入了com.sun.jdmk.comm.htmladaptorserver,是jmxtools.jar包里的类,但这个包并不包含在jdk5中,需要手工下载:
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#7657-jmx-1.2.1-oth-jpr
下载:java management extension (jmx) 1.2.1
先创建了一个mbeanserver,用来做mbean的容器
将hello这个类注入到mbeanserver中,注入需要创建一个objectname类
创建一个adaptorserver,这个类将决定mbean的管理界面,这里用最普通的html型界面。adaptorserver其实也是一个mbean。
alpha:name=helloworld的名字是有一定规则的,格式为:&域名:name=mbean名称&,域名和mbean名称都可以任意取。
4)运行helloagent,然后打开网页:http://localhost:8082/,
点击alpha - name=helloworld,即可对hello类的各个 进行管理:
点击printhello按钮,就能在控制台上看到对应的输出。
再看jmx相关概念
jmx构架中的各层及相关的组件
层(instrumentation level)&&&&(a) mbeans(标准的,动态的,开放的和模型mbeans)&&&&(b) 通知模型:notification、notificationlistener等类&&&&(c) mbean元数据类:attribute、opreator等类
代理层(agent level)&&&&(a) mbean server&&&&(b) 代理服务。如前一篇的htmladaptorserver等。
&mbean中有getter和setter的就是属性,如前一篇的hello类中name。如果只有getter则表示该属性只读。
一共有四种mbean,如下:
标准mbeans(standard mbeans)设计和实现是最简单的,这类mbean使用自己的 名作为管理接口;&&在前一篇中的hello、hellombean就是一个标准mbeans(standard mbeans)。后面接下来的几篇,我们会继续介绍其他几种mbean。
动态mbeans(dynamic mbeans)必须实现一个指定的接口,由于动态mbeans在运行期间暴露它们的管理接口,此文来自: 马开东博客
转载请注明出处 网址:
因此更为灵活;
开放mbeans(open mbeans)属于动态mbeans,这类mbean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明;
模型mbeans(model mbeans)同样也是动态mbeans,这类mbeans是完全可配置的,在运行期间进行自我声明;它们为资源动态提供一个一般性的,有默认行为的mbeans类。
搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
JMX1. 什么是JMXJDK中的JMX实现_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜}

我要回帖

更多关于 www.hnhmlj.com 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信