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

    WebJMX开源项目应用与进阶.docx

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

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

    WebJMX开源项目应用与进阶.docx

    最近公司用到一些关于JMX的使用,在我的BLOG之前介绍过JMX。一个简单的JMX结构由以下几个步骤去完成: 需要一个MBeanServer作为一个容器,去装载你的MBean如下创建:MBeanServer server = MBeanServerFactory.createMBeanServer("Local"); ObjectName,JDK文档对它的描述是这样的:表示 MBean 的对象名,或者能够与多个 MBean 名称相匹配的模式。我们可以从字面上了解到他是干什么的了,就好比一个KEY, 当我们的MBean注入MBeanServer后总要有一个标识它,以方便我们以后通过这个KEY去找过我们的MBean.如下创建:ObjectName manager = new ObjectName("NCS:name=scheduler"); 将我们需要进行管理的MBean注册到MBeanServer中,具体如下:     server.registerMBean(new IScheduler(), manager);这样就算告一段落了,完成以上步骤后,将实现一个MBeanServer(一个容器)中拥有多个MBean(受管理的类).这就是JMX的基本实现。那么如果要对MBean进行管理当然少不了一些管理机制,如SUN自己提供的HtmlAdaptorServer和Jconsole。HtmlAdaptorServer可以通过WEB对MBean进行管理,Jconsole则是C/S结构的。下面列举一下HtmlAdaptorServer的使用方法:HtmlAdaptorServer adapter = new HtmlAdaptorServer();    server.registerMBean(adapter, adapterName);以上代码片段可以看出其实HtmlAdaptorServer 也就是个MBean,而这个MBean可访问注册在MBeanServer的其他MBean而已。最后启动HtmlAdaptorServer :adapter.start();完整代码片段:/XXX()自定义方法名吧!public void XXX()   try     / create MBSERVER name is WUBINSERVER    List l = MBeanServerFactory.findMBeanServer(null);    if (l.size() > 0)      server = (MBeanServer) l.get(0);    else      server = MBeanServerFactory.createMBeanServer("Local");        / Register HtmlAdaptorserver port is 8082.    ObjectName adapterName = new ObjectName(      "ManagerAgent:name=htmladapter,port=8082");    HtmlAdaptorServer adapter = new HtmlAdaptorServer();    server.registerMBean(adapter, adapterName);    / your self objectname register.    ObjectName manager = new ObjectName("NCS:name=scheduler");    server.registerMBean(new IScheduler(), manager);        ObjectName manager2 = new ObjectName("NCS:name=scheduler2");    server.registerMBean(new IScheduler(), manager2);   /    ObjectName manager = new ObjectName("NCS:name=scheduler1");/    server.registerMBean(new JobManagerMBeanImpl(), manager);             adapter.start();    System.out.println("start.");   catch (MalformedObjectNameException e)     / TODO Auto-generated catch block    e.printStackTrace();   catch (InstanceAlreadyExistsException e)     / TODO Auto-generated catch block    e.printStackTrace();   catch (MBeanRegistrationException e)     / TODO Auto-generated catch block    e.printStackTrace();   catch (NotCompliantMBeanException e)     / TODO Auto-generated catch block    e.printStackTrace();   catch (NullPointerException e)     / TODO Auto-generated catch block    e.printStackTrace();   当我们访问本地的8082后就可以看到HtmlAdaptorServer 所提供的管理界面,但这样的管理界面非常不人性化,(那么丑,怎么见人呢?)那下面我隆重介绍的就是WebJMX!他能帮我们解决管理界面的问题,让我们可自编写自己的管理界面。WebJMX Tag Library Project首先下载WEBJMX(建议下1.2a版本)那在DOWNLOADING.的时候我来说一下WEBJMX的缺陷。(是不是开门一棒,呵呵,这个我必须先告诉大家一声,不然你发现如果WEBJMX并不适合你的工程那下来也没什么意义了。)缺陷:1、WEBJMX在2002年之后就再也没有更新过,最后一个版本是1.3。很遗憾,有可能以后都不会有新的更新,如果你觉得这点无法接受,我可以介绍给你其他-MX4J,不过这个东西很麻烦,如果有兴趣自己去找找资料吧。2、WEBJMX是中标签,其他就是利用标签库进行VIEW。虽说标签已属于过去式,但不代表没有人用它嘛,象我这样的老人家还在用呢!:)3、WEBJMX部署混乱,资料较缺。这点没有什么办法,所以我建议大家下WEBJMX1.2a版本,那个1.3版本的必须用ANT部署才行,而且里面有很多需要在环境变量里配置的东西,比如TOMCATHOME啊STRUTSHOME啊等等HOME。而且我发现在那ANT脚本里本提到有个JMX.war包在TEMP目录下,结果去寻找也没找到作者的失败之处4、WEBJMX用的JDK是1.4的,但不要紧也支持1.5好了,废话过后相信你的WEBJMX工程也该下好了,把开始我们的WEBJMX旅程吧,我希望它是轻松愉快的。小女子才疏学浅,如果有错误也希望得到批评,但不要象XX人在我的留言版中一样骂我,说偶的BLOG是垃圾BLOG,即便是垃圾BLOG也麻烦留点所谓的垃圾评语(为虾米垃圾)啊,否则就太不知所为了。我推荐的部署方式并不是用他提供的ANT脚本,而是我们自己的部署手段。我们先用MYECLIPSE创建一个WEB的PROJECT。叫WEBJMX,然后将WEBJMX目录下的org整个目录拷贝到我们的新建的工程的src目录下,然后我们会看到好多红叉叉。不用害怕,这都算少的了然后导入几个包包,这个包包有MX4J的、STRUTS的、QUICK的还有JMX自己的。由于WEBJMX是使用1.4的JDK。所以当时SUN公司还没有将JMX放到JDK中,.1.5就没事了。导完后差不多如下图那么多。有可能在org部署的时候会遇到enum这是因为WEBJMX使用的JDK是1.4的,而我们现在基本使用1.5以上的版本,只要用户自己随便改改变量名就可以了,别用enum这个变量名。以下展示了两幅图:这是HtmlAdaptorServer 的管理界面( HTML JMX HTMLAdaptor )而这就是WEBJMX实例的管理界面,是不是比上面那个人性化的多呢?( WbJMX JSP MBeanServer )结构()WEBJMX标签包括这些部分(JMX ) 一套JSP标签和描述标签句法的TLD的Java类。( JSP TLD Java ) 由一个SERVLET接受页面上表单提交过来的数据。其实在这表单的数据是WebJMX标记修改后生成的。这个表单类似于这样( SERVLET . &#39 ; s WebJMX . ):<jmx:formMBean name="changeschedulername" mbean="mbean" invoke="rescheduleJob" label="调用">于我们常见的FORM很不同。 通过使用JSP标签和Servlet调用AdapterFactory可以得到MBeanServers 。(MBeanServers Servlet JSP AdapterFactory)结构图:( ):我们可以从上图中看到,WEBJMX是怎么工作的(虽然不是流程图,但其实一目了然!)。用户通过WEB浏览器通过HTTP request 触发ACTION(JMXACTION SERVLET)然后通过JMXSerivceAdapter访问MBEANSERVER(能访问MBEANSERVER也以为着能管理SERVER中的MBEAN啦!),那JMXSerivceAdapter其实是种适配器,我们之前介绍过的HTMLAdapter也是适配器。好!下面就开始看看我们的例子来真正认识一下WEBJMX。首先作为一个WEB程序最重要的当然是WEB.xml啦,那我们就从它开始<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-/Sun Microsystems, Inc./DTD Web Application 2.2/EN" "<web-app><!- register the JMX Action URL as an application parameter-><context-param>    <param-name>jmxAction</param-name>    <param-value>jmxAction</param-value>    <description>Default mapping to the JMXAction servlet.</description></context-param><!- JMX Action Servlet Configuration -><servlet>    <servlet-name>agent</servlet-name>    <servlet-class>org.webjmx.example.AgentServlet</servlet-class>    <init-param>      <param-name>locator0</param-name>      <param-value>local</param-value>    </init-param>    <load-on-startup /></servlet><servlet>    <servlet-name>jmxAction</servlet-name>    <servlet-class>org.webjmx.servlet.JMXAction</servlet-class>    <load-on-startup /></servlet><servlet>    <servlet-name>action</servlet-name>    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>    <init-param>      <param-name>config</param-name>      <param-value>/WEB-INF/struts-config.xml</param-value>    </init-param>    <init-param>      <param-name>debug</param-name>      <param-value>3</param-value>    </init-param>    <init-param>      <param-name>detail</param-name>      <param-value>3</param-value>    </init-param>    <load-on-startup>0</load-on-startup></servlet><!- JMX Action Servlet Mapping -><servlet-mapping>    <servlet-name>jmxAction</servlet-name>    <url-pattern>/jmxAction</url-pattern></servlet-mapping><servlet-mapping>    <servlet-name>action</servlet-name>    <url-pattern>*.do</url-pattern></servlet-mapping><!- The Welcome File List -><welcome-file-list>    <welcome-file>index.html</welcome-file></welcome-file-list><!- JMX Tag Library Descriptor -><taglib>    <taglib-uri>/WEB-INF/jmx.tld</taglib-uri>    <taglib-location>/WEB-INF/jmx.tld</taglib-location></taglib><!- Struts Tag Library Descriptor -><taglib>    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location></taglib><taglib>    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location></taglib></web-app>非常关键的一个片段:<servlet>    <servlet-name>agent</servlet-name>    <servlet-class>org.webjmx.example.AgentServlet</servlet-class>    <init-param>      <param-name>locator0</param-name>      <param-value>local</param-value>    </init-param>    <load-on-startup /></servlet>我们可以看到有一个叫agent的servlet被声明了。那在TOMCAT启动的时候同时也被加载了。然后我们来跟踪一下这个servlet的内容。AgentServlet.java先来看看他的init()public void init(ServletConfig config) throws ServletException    super.init(config);   doInit();很明显,他在初始化的时候调用了doInit(),然后我们再看看doInit()/* instanitate some test MBeans.*/public void doInit() throws ServletException    if (Boolean.getBoolean(DEBUG_PROP)    log("AgentServlet init()");   List l = MBeanServerFactory.findMBeanServer(null);   if (Boolean.getBoolean(DEBUG_PROP)    log("MBeanServer count:" + l.size();   if (l.size() > 0)    server = (MBeanServer) l.get(0);   else    server = MBeanServerFactory.createMBeanServer("Local");   if (Boolean.getBoolean(DEBUG_PROP)    log("initalizing local server instance: " + server);   HtmlAdaptorServer html = new HtmlAdaptorServer(8086);   ObjectName ob_name = null;   try     ob_name = new ObjectName("Adaptor:name=html,port=8086");    if (Boolean.getBoolean(DEBUG_PROP)     log("OBJECT NAME: " + ob_name);    server.registerMBean(html, ob_name);    Enumeration e = getServletConfig().getInitParameterNames();    while (e.hasMoreElements()      String paramName = (String) e.nextElement();     if (!paramName.startsWith("locator")      continue;     String locator = getServletConfig().getInitParameter(paramName);     l = AdapterFactory.findMBeanServer(locator);     if (Boolean.getBoolean(DEBUG_PROP)      log("server list: " + l);     if (l.size() = 0)      return;     if (Boolean.getBoolean(DEBUG_PROP)      log("initalizing local server instance: " + server);     server = (MBeanServer) l.get(0);     if (Boolean.getBoolean(DEBUG_PROP)      log("server: " + server);     ob_name = new ObjectName("MBeanInfo", "name", "SimpleStandard");     if (Boolean.getBoolean(DEBUG_PROP)      log("OBJECT NAME: " + ob_name);     / server.createMBean("org.webjmx.example.SimpleStandard",ob_name);     server.registerMBean(new SimpleStandard(), ob_name);     ob_name = new ObjectName("MBeanInfo", "name", "SimpleDynamic");     if (Boolean.getBoolean(DEBUG_PROP)      log("OBJECT NAME: " + ob_name);     server.registerMBean(new SimpleDynamic(), ob_name);     / server.createMBean("org.webjmx.example.SimpleDynamic",     / ob_name);        /*    * ObjectName sname = new    * ObjectName("JMImplementation:type=MBeanServerDelegate");    * MBeanInfo minfo = server.getMBeanInfo(sname); MBeanAttributeInfo    * attrs = minfo.getAttributes(); System.out.println("attribute    * count: " +attrs.length); for(int i = 0; i < attrs.length; i+)    * System.out.println(attrsi.getName() +" : "    * +server.getAttribute(sname, attrsi.getName();    */   catch (Exception e)     log("t! Could not create the HTML adaptor !");    e.printStackTrace();    return;      html.start();在方法开头就有注释,告诉你这个方法是干什么的了(instanitate some test MBeans.)初始化一些测试的MBEN,这个这个还不完全,在方法的内容我们可以看到,不仅仅是初始化了一些MBEAN,更重要的是实例了一个MBEANSERVER并将适配器和需要管理的MBEAN都加载进去了。创建MBEANSERVER:List l = MBeanServerFactory.findMBeanServer(null);其实这个方法更适合去查找MBEANSERVER,但如果没有找到,则会返回一个默认的MBEANSERVER,创建一个Adaptor:HtmlAdaptorServer html = new HtmlAdaptorServer(8086);ob_name = new ObjectName("Adaptor:name=html,port=8086");注册这个适配器到MBEANSERVER中server.registerMBean(html, ob_name);好,下面是注册我们自己的MBEAN到MBEANSERVER中去。ob_name = new ObjectName("MBeanInfo", "name", "SimpleStandard");其实这个3参的构造方法跟ob_name= new ObjectName(“MBeanInfo:name=SimpleStandard”);是同理的。注册:server.registerMBean(new SimpleStandard(), ob_name);这样,我们的MBEAN就被注册到了MBEANSERVER中去了。然后就是启动我们的适配器,让我们的用户可以通过适配器去访问我们的MBEANSERVER了。html.start();这样,都WEB.XML和必要的servlet都已经写好了。然后就该在我们的页面上运用我们的标记进行访问我们的MBEAN了。在例子的基本页面index.html细节我就些了,我们看关键的东西<a href="server1.jsp?locator=local&domain=Local&name=Local">可以看到这个超连接是跳转到server1.jsp并带了几个重要的参数。locator=local,domain=Local还有name=Local。哎?!为什么看起来那么想我们的ObjectName的参数?没错!后面两个参数确实是ObjectName的参数所用的,就是new ObjectName(Local:name=Local)。而locator=local这个是WEBJMX特定的,local是指本地的MBEANSERVER访问方式,还有remote方式。在这里我们暂时不说这两种方式,我回在回复栏里细说这两个参数倒底是干什么用的。然后我们看看server1.jsp的内容:头部分:标记的声明<% page import="java.util.*, javax.management.*" %><% taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><% taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><% taglib uri="/WEB-INF/jmx.tld" prefix="jmx" %>变量的声明,这些变量非常重要,<bean:parameter id="locator" name="locator"/><bean:parameter id="domain" name="domain"/><bean:parameter id="serverName" name="name"/><jmx:getMBeanServer id="server" attribute="locator"/><jmx:getMBeanServer id="server" attribute="locator"/>这个变量也就类似我们获得了之前在我们的servlet中声明好的MBeanServer,可能你会想,那这个MBeanServer是哪来的啊?其实当我们使用<jmx:getMBeanServer>的时候他会根据后面的attribute元素的值去内存中找这个名叫locator的MBeanServer的实例,就好比MBeanServerFactory.findMBeanServer(“locator")。 体部分:<jmx:queryNames id="names" server="server">MBeanInfo:name=SimpleStandard</jmx:queryNames>以名为MBeanInfo:name=SimpleStandard为条件,到server(之前声明好的MBEANSERVER对象)中去找这个ObjectName所对应的MBean,其实ObjectName和MBean是1对1的关系,一个ObjectName对应一个MBean,就好比我们的Map类,一个KEY对应一个Value,用Key找Value一样。他返回的是一个List(其实我个人觉得没必要返回LIST)。获得单个MBean:<logic:iterate id="n" name="names" length="1">再下去的内容我就不说了,没什么用。接下去我们就自己来做个一HelloWorld吧.新建一个WEB OBJECT(我这里使用了MYECLIPSE,东西都是自动就加载的,如果你用其他的编译器那只好你自己看着大概去做了),然后导入STRUTS LIBS(MYECLIPSE自动生成)。接着在WEB-INF目录中放下几个WEBJMX重要的文件AdapterFactoryInit.qjml,AdapterFactoryInit.xml,jmx.tld,QJML.dtd。这些文件在WEBJMX开源项目1.2a中都有。然后是我们的web.xml,内容如下:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance" version="2.5"xsi:schemaLocation="   <!- register the JMX Action URL as an application parameter-><context-param>   <param-name>jmxAction</param-name>   <param-value>jmxAction</param-value></context-param><servlet>   <servlet-name>action</servlet-name>   <servlet-class>    org.apache.struts.action.ActionServlet   </servlet-class>   <init-param>    <param-name>config</param-name>    <param-value>/WEB-INF/struts-config.xml</param-value>   </init-param>   <init-param>    <param-name>debug</param-name>    <param-value>3</param-value>   </init-param>   <init-param>    <param-name>detail</param-name>    <param-value>3</param-value>   </init-param>   <load-on-startup>0</load-on-startup></servlet><servlet-mapping>   <servlet-name>action</servlet-name>   <url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list>   <welcome-file>index.jsp</welcome-file></welcome-file-list><!- JMX Action Servlet Configuration -><servlet>   <servlet-name>agent</servlet-name>   <servlet-class>    com.kekemao1.jmxexample.servlet.AgentServlet   </servlet-class>   <init-param>    <param-name>locator0</param-name>    <param-value>local</param-value>   </init-param>   <load-on-startup /></servlet><servlet>   <servlet-name>jmxAction</servlet-name>   <servlet-class>org.webjmx.servlet.JMXAction</servlet-class>   <load-on-startup /></servlet><!- JMX Action Servlet Mapping -><servlet-mapping>   <servlet-name>jmxAction</servlet-name>   <url-pattern>/jmxAction</url-pattern></servlet-mapping></web-app>大家看到其实和我先前介绍的例子的XML没什么区别,其实这些是必要的。写好WEB.XML后,我们来完成servlet部分,如上描述的那样,我们有一个com.kekemao1.jmxexample.servlet.AgentServlet需要去实现:com.kekemao1.jmxexample.servlet.AgentSer

    注意事项

    本文(WebJMX开源项目应用与进阶.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开