- 浏览: 701313 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47680
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
1. MBean介绍
从上一篇Blog的内容可以看到,我们大多数代码工作量都是自定义的一个JavaBean,这个JavaBean有属性、访问器(get)、写操作(set),之后还可以定义一些非常规方法,比如执行核心管理操作的方法,甚至还可以深度调用full gc进行全面的资源回收。也就是说这个JavaBean并不像它的名字那么简单,它负责了一些监管任务等等。使用者灵活地使用JMX客户端工具,比如咱们上一章介绍的JConsole。借助Sprng框架,给开发者的感觉就是仅仅开发这种JavaBean就可以了。这种看似简单的JavaBean叫做MBean(管理构建),比较权威的定义是:在JMX规范中,管理构件定义如下:它是一个能代表管理资源的Java对象,遵从一定的设计模式,还需实现该规范定义的特定的接口。该定义了保证了所有的管理构件以一种标准的方式来表示被管理资源。
资源是什么?程序、日志、持久化数据、硬件、内存、网络吞吐量等等皆可看作是系统资源。管理资源暴露出一些信息,让外部能够进行远程查看和远程监管,这就是管理构建要做的事情。当然了管理构建MBean还得支持类似于JMS那种订阅/通知的机制。
2. MBean的类型
标准管理构建,学名——Standard MBean,本身暴露MBean需要符合某些命名规范,比如类结尾以MBean等等,但是使用了框架,这些限制就被透明化了。换句话说开发者只需要定制一个POJO即可,之后暴露即可。这也是上一章节的那些JMX——MBean。
public class ServerImpl {
public final long startTime;
public ServerImpl() {
startTime = System.currentTimeMillis();
}
}
之后对其进行监管
public class ServerMonitor implements ServerMonitorMBean { private final ServerImpl target; public ServerMonitor(ServerImpl target){ this.target = target; } public long getUpTime(){ return System.currentTimeMillis() - target.startTime; } }
之后就是暴露MBean服务
动态代理构建,学名——DynamicMBean,这个笔者觉得有点像Java的反射机制的一个使用场景,就是在运行期间,你不知道你系统要调用哪个类、哪个方法,但是又想在运行期间顺利的调用到该方法,那怎么办?动态MBean可以解决这个问题。 实现javax.management.DynamicMBean 接口和它定义的方法,即可,该接口定义了以下6个方法: getMBeanInfo getAttribute setAttribute getAttributes setAttributes invoke 从方法名字上可以知晓和Java的反射机制差不多啊,都是获得对象的一些元数据,之后进行动态invoke。这里插一句,既然可以动态invoke调用动态MBean的方法,是不是就意味着可以像AOP面向切面编程一样对动态MBean进行横向侵入呢?答案是肯定的。由于DynamicMBean的接口是不变的,因此可以屏蔽实现细节。由于这种在运行期获取管理接口的特性,动态管理构件提供了更大的灵活性。import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
public class Main {
private static ObjectName objectName ;
private static MBeanServer mBeanServer;
public static void main(String[] args) throws Exception{
init();
manage();
}
private static void init() throws Exception{
ServerImpl serverImpl = new ServerImpl();
ServerMonitor serverMonitor = new ServerMonitor(serverImpl);
mBeanServer = MBeanServerFactory.createMBeanServer();
objectName = new ObjectName("objectName:id=ServerMonitor1");
mBeanServer.registerMBean(serverMonitor,objectName);
}
private static void manage() throws Exception{
Long upTime = (Long) mBeanServer.getAttribute(objectName,
"upTime");
System.out.println(upTime);
}
}
import javax.management.*; import java.lang.reflect.*; public class ServerMonitor implements DynamicMBean { private final ServerImpl target; private MBeanInfo mBeanInfo; public ServerMonitor(ServerImpl target){ this.target = target; } // 实现获取被管理的 ServerImpl 的 upTime public long upTime(){ return System.currentTimeMillis() - target.startTime; } //javax.management.MBeanServer 会通过查询 getAttribute("Uptime") 获得 "Uptime" 属性值 public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if(attribute.equals("UpTime")){ return upTime(); } return null; } // 给出 ServerMonitor 的元信息。 public MBeanInfo getMBeanInfo() { if (mBeanInfo == null) { try { Class cls = this.getClass(); // 用反射获得 "upTime" 属性的读方法 Method readMethod = cls.getMethod("upTime", new Class[0]); // 用反射获得构造方法 Constructor constructor = cls.getConstructor(new Class[] {ServerImpl.class}); // 关于 "upTime" 属性的元信息 : 名称为 UpTime,只读属性 ( 没有写方法 )。 MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo( "UpTime", "The time span since server start", readMethod, null); // 关于构造函数的元信息 MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo( "Constructor for ServerMonitor", constructor); //ServerMonitor 的元信息,为了简单起见,在这个例子里, // 没有提供 invocation 以及 listener 方面的元信息 mBeanInfo = new MBeanInfo(cls.getName(), "Monitor that controls the server", new MBeanAttributeInfo[] { upTimeMBeanAttributeInfo }, new MBeanConstructorInfo[] { mBeanConstructorInfo }, null, null); } catch (Exception e) { throw new Error(e); } } return mBeanInfo; } public AttributeList getAttributes(String[] arg0) { return null; } public Object invoke(String arg0, Object[] arg1, String[] arg2) throws MBeanException, ReflectionException { return null; } public void setAttribute(Attribute arg0) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { return; } public AttributeList setAttributes(AttributeList arg0) { return null; } }
开放式管理构建,学名——Open MBean,开放管理构件是一种专门化的动态管理构件,其中所有的与该管理构件相关的参数、返回类型和属性都围绕一组预定义的数据类型(String、Integer、Float 等)来建立,并且通过一组特定的接口来进行自我描述。JMX代理通过获得一个OpenMBeanInfo对象来获取开放管理构件的管理接口,OpenMBeanInfo是MbeanInfo的子类。很可惜,这个没实例,也不经常使用。希望经常使用这个的童鞋将这块补上。
模型MBean,学名——ModelMBean,模型管理构件也是一种专门化的动态管理构件。普通的动态管理构建通常缺乏一些管理系统所需要的支持:比如持久化MBean的状态、日志记录、缓存等等。如果让用户去实现这些功能确实比较繁琐。为了减轻用户的负担,JMX 提供商都会提供不同的ModelBean实现。其中有一个接口是Java规范中规定所有厂商必须实现的:javax.management.modelmbean.RequiredModelBean。通过配置描述信息,我们可以定制这个ModelBean,指定哪些MBean状态需要记入日志、如何记录以及是否缓存某些属性、缓存多久等等。还是使用网上实例
public class Server { private long startTime; public Server() { } public int start(){ startTime = System.currentTimeMillis(); return 0; } public long getUpTime(){ return System.currentTimeMillis() - startTime; } }
之后也是暴露如下
import javax.management.*; import javax.management.modelmbean.*; public class Main { public static void main(String[] args) throws Exception{ MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer(); RequiredModelMBean serverMBean = (RequiredModelMBean) mBeanServer.instantiate( "javax.management.modelmbean.RequiredModelMBean"); ObjectName serverMBeanName = new ObjectName("server: id=Server"); serverMBean.setModelMBeanInfo(getModelMBeanInfoForServer(serverMBeanName)); Server server = new Server(); serverMBean.setManagedResource(server, "ObjectReference"); ObjectInstance registeredServerMBean = mBeanServer.registerMBean((Object) serverMBean, serverMBeanName); serverMBean.invoke("start",null, null); Thread.sleep(1000); System.out.println(serverMBean.getAttribute("upTime")); Thread.sleep(5000); System.out.println(serverMBean.getAttribute("upTime")); } private static ModelMBeanInfo getModelMBeanInfoForServer(ObjectName objectName) throws Exception{ ModelMBeanAttributeInfo[] serverAttributes = new ModelMBeanAttributeInfo[1]; Descriptor upTime = new DescriptorSupport( new String[] { "name=upTime", "descriptorType=attribute", "displayName=Server upTime", "getMethod=getUpTime", }); serverAttributes[0] = new ModelMBeanAttributeInfo( "upTime", "long", "Server upTime", true, false, false, upTime); ModelMBeanOperationInfo[] serverOperations = new ModelMBeanOperationInfo[2]; Descriptor getUpTimeDesc = new DescriptorSupport( new String[] { "name=getUpTime", "descriptorType=operation", "class=modelmbean.Server", "role=operation" }); MBeanParameterInfo[] getUpTimeParms = new MBeanParameterInfo[0]; serverOperations[0] = new ModelMBeanOperationInfo("getUpTime", "get the up time of the server", getUpTimeParms, "java.lang.Long", MBeanOperationInfo.ACTION, getUpTimeDesc); Descriptor startDesc = new DescriptorSupport( new String[] { "name=start", "descriptorType=operation", "class=modelmbean.Server", "role=operation" }); MBeanParameterInfo[] startParms = new MBeanParameterInfo[0]; serverOperations[1] = new ModelMBeanOperationInfo("start", "start(): start server", startParms, "java.lang.Integer", MBeanOperationInfo.ACTION, startDesc); ModelMBeanInfo serverMMBeanInfo = new ModelMBeanInfoSupport( "modelmbean.Server", "ModelMBean for managing an Server", serverAttributes, null, serverOperations, null); //Default strategy for the MBean. Descriptor serverDescription = new DescriptorSupport( new String[] { ("name=" + objectName), "descriptorType=mbean", ("displayName=Server"), "type=modelmbean.Server", "log=T", "logFile=serverMX.log", "currencyTimeLimit=10" }); serverMMBeanInfo.setMBeanDescriptor(serverDescription); return serverMMBeanInfo; }
通常开发JMX都有以下几个步骤:
创建一个MBServer:mBeanServe
获得管理资源用的MBean:serverBean
给这个MBean一个ObjectName:serverMBeanName
将serverBean以serverMBeanName注册到mBeanServer上去。
这篇总结大多数是查看的网络资料,学习交流而已,比较理论化,以下是查询的几篇资料链接。JMX工作原理图如下
参考资料:
http://www.ibm.com/developerworks/cn/java/j-lo-jse63/index.html
http://www.cnblogs.com/aurawing/articles/1887060.html
http://baike.baidu.com/view/866268.htm
发表评论
-
Java分布式应用学习笔记08JMX规范与常用的监控场景
2011-09-13 09:17 91421. JMX规范 JMX是“Java管理扩展的”的缩写,它 ... -
Java分布式应用学习笔记07线程池应用(又名:线程池与大排档)
2011-09-07 09:00 72121. 线程池是啥子 一说到池子,大家都会想到数据库连接池那 ... -
Java分布式应用学习笔记06浅谈并发加锁机制分析
2011-08-19 16:12 80851. 前言 之前总结的多线程的调度、并发调度、线程加锁安全 ... -
Java分布式应用学习笔记05多线程下的并发同步器----后篇
2011-08-11 09:07 70165. CountDownLatch 很多资料上都说Coun ... -
Java分布式应用学习笔记05多线程下的并发同步器----前篇
2011-08-11 09:02 93561. 前言 JDK提供的并发包,除了上一篇提到的用于集合外 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---后篇
2011-08-02 17:21 4490唉~这一大篇blog又是只能显示部分,部分内容被截断了。。。。 ... -
Java分布式应用学习笔记04JDK的并发包的集合总结---前篇
2011-08-02 17:17 53831. 前言 平时咱们使用的HashMap、ArrayLis ... -
Java分布式应用学习笔记03JVM对多线程的资源同步和交互机制
2011-07-28 10:55 66271. 前言 既然是分布式 ... -
Java分布式应用学习笔记02再谈JVM---续
2011-07-25 09:22 3815唉~~因为blog总显示不全只能分为2个了,排版也不是很好,凑 ... -
Java分布式应用学习笔记02再谈JVM
2011-07-25 09:10 58711. 前言-为何要再谈JVM 很多人认为,分布式Java应 ... -
Java分布式应用学习笔记01分布式Java应用和SOA
2011-07-22 13:52 42521. 前言 当我们所做的 ... -
使用Memcached做分布式系统的Session存储
2011-07-01 10:12 85161. 前言 Memcache除了可以做Hibernate的 ... -
用xmemcache作为JPA(Hibernate实现)二级缓存
2011-06-30 09:44 60561. 持久层的缓存 Hibern ... -
Apache_proxy负载均衡和Session复制
2011-04-06 09:26 10855今天上网查了查资料,之前使用apache的jk模块做负载均衡。 ... -
Java基于线程的分布式(转自cjnetwork)
2011-03-22 17:50 1719java基于线程的分布式 ... -
JBoss集群配置的Session复制
2011-03-21 09:19 59791. 前言 接着上一篇总结文章提出的问题,这次通 ... -
JBoss节点的负载均衡与Mysql主从备份
2011-03-16 22:37 24781. 前言 做JavaEE企业级应用就离不开集群 ... -
在default目录下快速配置JBoss集群(Web方面) 转载
2011-03-06 10:24 2226说起JBoss集群好像很高深的样子,其实一点也不恐怖,建立一个 ...
相关推荐
### Java分布式应用学习笔记09JMX-MBean的介绍 #### MBean概念及作用 MBean,即Managed Bean,是在JMX(Java Management Extensions)框架中用于管理资源的一种特殊Java对象。通过MBean,可以方便地对应用程序进行...
java
Java Management Extensions (JMX) 是Java平台上的一个标准,它定义了一种管理和监控Java应用程序的机制。JMX规范允许开发者创建可管理的组件,并通过管理系统(如JConsole)进行监控和控制。这些组件称为MBeans...
Jboss控制台jmx-console的安全设置
在IT领域,特别是对于使用JBOSS的企业级应用服务器的管理员和开发者而言,掌握如何设置JBOSS控制台(具体为jmx-console)的登录密码是一项至关重要的技能。这不仅关乎系统的安全性,还直接影响到对服务器监控和管理...
总的来说,JMX和MBean Server提供了一种标准、灵活的管理方式,使得Java应用的管理和监控变得更加便捷。通过结合Spring框架,开发者可以更轻松地在应用中集成JMX功能,实现对应用的全方位管理。
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。这里提到的三个ZIP文件包含了不同版本的JMX实现和规范,分别是: 1. **jmx-1_2_1-ri.zip**:这...
tomcat-catalina-jmx-remote-9.0.5 tomcat-catalina-jmx-remote-9.0.5.jar
通过研究"jmx-1_2_1-ri.zip"中的源代码,开发者可以学习到如何创建自定义MBeans,如何与MBean服务器交互,以及如何利用JMX进行复杂的监控和管理任务。对于开发高效、可扩展和可管理的Java应用程序来说,深入理解JMX...
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、服务和设备。JMX提供了创建、配置、查询和管理管理对象(MBeans)的能力,这些对象可以代表任何可管理的资源,从操作系统到...
总的来说,"jmx-1.2.1(jmxri+jmxtools) jar"是Java环境中管理和监控的重要工具集,它提供了远程访问和管理Java应用的能力,以及一系列辅助工具和库,使得开发者和运维人员能够更好地控制和理解他们的Java系统。
在Java世界中,分布式应用程序设计是一项关键技能,它允许开发者构建可扩展的、高可用性的系统,能够跨越多个网络节点协同工作。以下是对标题和描述中所提及知识点的详细阐述: 1. **Java分布式计算基础**:Java为...
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。它提供了一种灵活的框架,允许开发者创建和注册管理接口,以便于远程管理和监控Java应用。在您...
jbaoo4.2.3-jmx-console未授权访问
申乐公司是知名的继电器制造商,其JMX-100F磁保持继电器是他们产品线中的一个重要成员。这款继电器采用磁保持技术,具有高效、稳定和低功耗的特点。 磁保持继电器的工作原理是基于电磁场的原理,它在没有电流通过时...
csdn有一个下载包含HtmlAdaptorServer这个class,不过不知道是不是官方的,而且跟网上介绍的资料不一样,所以自己去oracle官网找着下载下来分享给大家,只要2分啦 包含资源文件为如下: jmx_remote-1_0_1_03-ri.zip jmx-1...
tomcat-catalina-jmx-remote-8.0.21.jar架包,用于jconsole使用时tomcat无法启动报错
`catalina-jmx-remote.rar`这个压缩包文件,显然与通过JMX远程访问Catalina相关,让我们深入探讨一下这个主题。 首先,理解JMX的原理和作用是至关重要的。JMX允许开发者创建和注册管理对象(MBeans),这些对象代表...