欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    JMX一步步来.doc

    • 资源ID:4015456       资源大小:140KB        全文页数:29页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    JMX一步步来.doc

    JMX一步步来1、 JMX的Hello World 一、JMX简介什么是JMX?在一篇网文中是这样说的:"JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理",这句话我现在看着还是不知所云,云里雾里。我们还是从JMX能给我们提供什么好处入手来理解吧。举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢?1 程序初哥一般是写死在程序里,到要改变时就去改程序,然后再编译发布;2 程序熟手则一般把这些信息写在一个配置文件里(JAVA一般都是*.properties文件),到要改变时只要改配置文件,但还是重新启动系统,以便读取配置文件里的新值;3 程序好手则会写一个段代码,把配置值缓存起来,系统在读值的时候,先看看配置文件有没有更动。如有更改则重读一遍,否则从缓存里读取值4 程序高手则懂得取物为我所用,用JMX!把配置属性集中在一个类,然后写一个叫MBean的东东,再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些配置信息。二、准备工作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的代码了。但JDK5.0并非包含所有SUN的关于JMX的代码,有一些工具类是排除在JDK5.0之外的。下面根据所使用的JDK版本情况,谈一谈开发环境的准备。1、JDK1.3、1.4去SUN网站下载SUN的JMX实现,共两个ZIP文件,下载网址:(1)jmx-1_2_1-ri.zip解压后的lib目录包含:jmxri.jar、jmxtools.jar(2)jmx_remote-1_0_1_03-ri.zip解压后的lib目录包含:jmxremote.jar、jmxremote_optional.jar、rmissl.jar如果在DOS下用命令行开发,则把这五个JAR包加入到classpath系统变量中。如果你用Eclipse开发,则把JAR包加入到项目属性的Libratries(库)引用中。2、JDK5.0JDK5.0的jrelibrt.jar已经包含了jmxri.jar、jmxremote.jar、rmissl.jar三个包的代码。如果你用到jmxtools.jar、jmxremote_optional.jar的类,则需要将这两个类加入到classpath或Eclipse的项目库引用中。3、我使用的开发环境:JDK5.0 Eclipse3.2。注:因为用到jmxtools.jar中的HtmlAdaptorServer类,所以将此包加入到项目库引用中。jmxremote_optional.jar暂时不用到,不管它。三、HelloWorld实例1、Hello是一个需要被管理的类(普通类)java 代码5 package com.sunhill.jmx; 6 7 public class Hello implements HelloMBean 8 private String name; 9 10 public String getName() 11 return name; 12 13 14 public void setName(String name) 15 this.name = name; 16 17 18 public void printHello() 19 System.out.println("Hello World, " + name); 20 21 22 public void printHello(String whoName) 23 System.out.println("Hello , " + whoName); 24 25 2、要管理Hello则必须创建一个相应MBean,如下:java 代码26 package com.sunhill.jmx; 27 28 public interface HelloMBean 29 public String getName(); 30 31 public void setName(String name); 32 33 public void printHello(); 34 35 public void printHello(String whoName); 36 说明:包含在MBean中方法都将是可以被管理的。MBean起名是有规范的,就是原类名后加上MBean字样。3、创建一个Agent类 java 代码37 package com.sunhill.jmx; 38 39 import java.lang.management.ManagementFactory; 40 41 import javax.management.MBeanServer; 42 import javax.management.ObjectName; 43 44 import m.HtmlAdaptorServer; 45 46 public class HelloAgent 47 public static void main(String args) throws Exception 48 / MBeanServer server = MBeanServerFactory.createMBeanServer(); 49 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); 50 ObjectName helloName = new ObjectName("chengang:name=HelloWorld"); 51 server.registerMBean(new Hello(), helloName); 52 ObjectName adapterName = new ObjectName( 53 "HelloAgent:name=htmladapter,port=8082"); 54 HtmlAdaptorServer adapter = new HtmlAdaptorServer(); 55 server.registerMBean(adapter, adapterName); 56 adapter.start(); 57 System.out.println("start."); 58 59 说明:· 先创建了一个MBeanServer,用来做MBean的容器· 将Hello这个类注入到MBeanServer中,注入需要创建一个ObjectName类· 创建一个AdaptorServer,这个类将决定MBean的管理界面,这里用最普通的Html型界面。AdaptorServer其实也是一个MBean。· chengang:name=HelloWorld的名字是有一定规则的,格式为:“域名:name=MBean名称”,域名和MBean名称都可以任意取。4、运行HelloAgent,然后打开网页:http:/localhost:8082/,看效果!五、总结在实际系统中我们可以把name变成决定数库链接池的变量,这样我就可以对系统的运行参数进行实现的监控和配置(管理)。而且也可以对一些方法(如printHello)进行远程调用了。 2、 JMX简介 一、JMX简介JMX是一种JAVA的正式规范,它主要目的是让程序且有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如网站),它是在小时不简断运行的,那么你可能会想要“监控”这个软件的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想“配置”这个软件,比如现在访问人数比较多,你想把数据连接池设置得大一些。当然,你也许会专门为这些管理来开发软件,但如果你借助JMX,则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面,已经有通用的JMX管理软件,如MC4J,或者是用一般都附带提供的HTML网页来管理,你要做的仅仅是将自己要被管理和监控类的按照JMX规范修改一下即可。中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。下面将JMX的一些概念,从JMX规范转帖如下:二、JMX构架中的各层及相关的组件1 工具层(Instrumentation Level) (a) MBeans(标准的,动态的,开放的和模型MBeans) (b) 通知模型:Notification、NotificationListener等类 (c) MBean元数据类:Attribute、Opreator等类2 代理层(Agent Level) (a) MBean Server (b) 代理服务。如前一篇的HtmlAdaptorServer等。 MBean中有getter和setter的就是属性,如前一篇的Hello类中Name。如果只有getter则表示该属性只读。一共有四种MBean,如下:3 标准MBeans(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口;4 动态MBeans(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活;5 开放MBeans(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明;6 模型MBeans(Model MBeans)同样也是动态MBeans,这类MBeans是完全可配置的,在运行期间进行自我声明;它们为资源动态工具提供一个一般性的,有默认行为的MBeans类。在前一篇中的Hello、HelloMBean就是一个标准MBeans(Standard MBeans)。后面接下来的几篇,我们会继续介绍其他几种MBean。3、Notification的使用 一、简介Mbean之间的通信是必不可少的,Notification就起到了在Mbean之间沟通桥梁的作用。JMX notification 由四部分组成:· Notification 这个相当于一个信息包,封装了需要传递的信息· Notification broadcaster这相当于一个广播器,把消息广播出去· Notification listerner这是一个监听器,用于监听广播出来的Notification消息· Notification filter这是一个过滤器,过滤掉不需要的Notification消息 Notification broadcaster不需要我们实现,JMX的内部已经有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。二、实例在第一篇的Hello中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如: Jack从对面走过来,说:“hi”我们回之以礼,说:“Hello, jack”首先这需要Jack先说一个hi(相应一个操作方法),然后他说的话封装成声波(相当Notification消息包)传递出去。然后我们还要给Jakc装上一个监听器(Hello的耳朵?_),这个监听器将捕捉到Jack的声波语音包,并进行相应处理,即说“Hello, jack”。好,我们看看如何实现的:1、Jack类及其相应的MBean 我们把Jack写成一个MBean,如下: java 代码1 import javax.management.Notification; 2 import javax.management.NotificationBroadcasterSupport; 3 public class Jack extends NotificationBroadcasterSupport implements JackMBean 4 private int seq = 0; 5 public void hi() 6 Notification n = new Notification(/创建一个信息包 7 "jack.hi",/给这个Notification起个名称 8 this, /由谁发出的Notification 9 +seq,/一系列通知中的序列号,可以设任意数值 10 System.currentTimeMillis(),/发出时间 11 "Jack");/发出的消息文本 12 /发出去 13 sendNotification(n); 14 15 16 说明: · 必需继承NotificationBroadcasterSupport· 此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去· 如果你还要在消息包上附加其他数据,Notification还有一个setUserData方法可供使用2、接下来是他的MBean java 代码17 public interface JackMBean 18 public void hi(); 19 3、创建一个Listener,监听到的Notification消息包将由此类负责处理。 java 代码20 import javax.management.Notification; 21 import javax.management.NotificationListener; 22 public class HelloListener implements NotificationListener 23 public void handleNotification(Notification n, Object handback) 24 System.out.println("type=" + n.getType(); 25 System.out.println("source=" + n.getSource(); 26 System.out.println("seq=" + n.getSequenceNumber(); 27 System.out.println("send time=" + n.getTimeStamp(); 28 System.out.println("message=" + n.getMessage(); 29 if (handback != null) 30 if (handback instanceof Hello) 31 Hello hello = (Hello) handback; 32 hello.printHello(n.getMessage(); 33 34 35 4、修改HelloAgent如下:java 代码36 import javax.management.MBeanServer; 37 import javax.management.MBeanServerFactory; 38 import javax.management.ObjectName; 39 import m.HtmlAdaptorServer; 40 public class HelloAgent 41 public static void main(String args) throws Exception 42 MBeanServer server = MBeanServerFactory.createMBeanServer(); 43 ObjectName helloName = new ObjectName("chengang:name=HelloWorld"); 44 Hello hello=new Hello(); 45 server.registerMBean(hello, helloName); 46 ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082"); 47 HtmlAdaptorServer adapter = new HtmlAdaptorServer(); 48 server.registerMBean(adapter, adapterName); 49 Jack jack = new Jack(); /重点 50 server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"); /重点 51 jack.addNotificationListener(new HelloListener(), null, hello); /重点 52 adapter.start(); 53 System.out.println("start."); 54 三、运行 1、先运行HelloAgent启动服务,再打开浏览器输入网址:http:/localhost:8082/2、进入“name=jack”项,然后单击“hi”按钮来执行它。 四、总结Notification和Java的事件模型是一样的,另外如果你买了Eclipse从入门到精通,你会发现第22.4节也使用了和Notification和Java的事件模型相同的设计方式。Notification在我们的实际项目中也用到了,象我们现在的给移动做的项目中(基于JMX实现),分散在各地方的工作站的日志,就是通过Notification方式,把每条产生的日志封装在Notification中实时发回主控服务器的。有机会我会发这一系统的关于日志的设计方案写一下,它实现了对各地工作站的集中的、实时的监控,非常实用。 4、动态MBean:DynamicMBean 一、前言动态MBean是在运行期才定义它的属性和方法,也就是说它有什么属性和方法是可以动态改变的。动态MBean主要利用一些辅助类(构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo)来完成这个功能,所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后,使用方法和第一篇文章中普通的MBean一样。给出一个动态MBean的实例,这个实例最初动态构了一个Name属性及一个print方法,当我们执行它的print方法之后,又给此MBean新增了一个print1方法。实例的代码如下:二、实例1、HelloDynamic类java 代码1 import java.lang.reflect.Constructor; 2 import java.util.Iterator; 3 import javax.management.Attribute; 4 import javax.management.AttributeList; 5 import javax.management.DynamicMBean; 6 import javax.management.MBeanAttributeInfo; 7 import javax.management.MBeanConstructorInfo; 8 import javax.management.MBeanException; 9 import javax.management.MBeanInfo; 10 import javax.management.MBeanNotificationInfo; 11 import javax.management.MBeanOperationInfo; 12 import javax.management.MBeanParameterInfo; 13 import javax.management.ReflectionException; 14 15 /* 16 * author Sunny Peng 17 * author change by Chen.Gang, add a feature for dynamic add operation 18 * version 1.0 19 */ 20 public class HelloDynamic implements DynamicMBean 21 /这是我们的属性名称 22 private String name; 23 private MBeanInfo mBeanInfo = null; 24 private String className; 25 private String description; 26 private MBeanAttributeInfo attributes; 27 private MBeanConstructorInfo constructors; 28 private MBeanOperationInfo operations; 29 MBeanNotificationInfo mBeanNotificationInfoArray; 30 31 public HelloDynamic() 32 init(); 33 buildDynamicMBean(); 34 35 36 private void init() 37 className = this.getClass().getName(); 38 description = "Simple implementation of a dynamic MBean." 39 attributes = new MBeanAttributeInfo1; 40 constructors = new MBeanConstructorInfo1; 41 operations = new MBeanOperationInfo1; 42 mBeanNotificationInfoArray = new MBeanNotificationInfo0; 43 44 45 private void buildDynamicMBean() 46 /设定构造函数 47 Constructor thisconstructors = this.getClass().getConstructors(); 48 constructors0 = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors0); 49 /设定一个属性 50 attributes0 = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false); 51 /operate method 我们的操作方法是print 52 MBeanParameterInfo params = null;/无参数 53 operations0 = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO); 54 mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray); 55 56 57 /动态增加一个print1方法 58 private void dynamicAddOperation() 59 init(); 60 operations = new MBeanOperationInfo2;/设定数组为两个 61 buildDynamicMBean(); 62 operations1 = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO); 63 mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray); 64 65 66 public Object getAttribute(String attribute_name) 67 if (attribute_name != null) 68 return null; 69 if (attribute_name.equals("Name") 70 return name; 71 return null; 72 73 74 public void setAttribute(Attribute attribute) 75 if (attribute = null) 76 return; 77 String Name = attribute.getName(); 78 Object value = attribute.getValue(); 79 try 80 if (Name.equals("Name") 81 / if null value, try and see if the setter returns any exception 82 if (value = null) 83 name = null; 84 / if non null value, make sure it is assignable to the attribute 85 else if (Class.forName("java.lang.String").isAssignableFrom(value.getClass() 86 name = (String) value; 87 88 89 catch (Exception e) 90 e.printStackTrace(); 91 92 93 94 public AttributeList getAttributes(String attributeNames) 95 if (attributeNames = null) 96 return null; 97 AttributeList resultList = new AttributeList(); 98 / if attributeNames is empty, return an empty result list 99 if (attributeNames.length = 0) 100 return resultList; 101 for (int i = 0; i < attributeNames.length; i+) 102 try 103 Object value = getAttribute(attributeNamesi); 104 resultList.add(new Attribute(attributeNamesi, value); 105 catch (Exception e) 106 e.printStackTrace(); 107 108 109 return resultList; 110 111 112 public AttributeList setAttributes(AttributeList attributes) 113 if (attributes = null) 114 return null; 115 AttributeList resultList = new AttributeList(); 116 / if attributeNames is empty, nothing more to do 117 if (attributes.isEmpty() 118 return resultList; 119 / for each attribute, try to set it and add to the result list if successfull 1

    注意事项

    本文(JMX一步步来.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开