`
grzrt
  • 浏览: 182692 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转载]JDMK 基本JMX配置( html adaptor)

    博客分类:
  • JAVA
 
阅读更多
原文地址: JDMK 基本JMX配置( html adaptor) 作者: macg
  • JDMK概述

JDMK(Java Dynamic Management Kit)是由JAVA的一个应用程序接口(JAVA API)和一套开发工具组成的。
JDMK是JMX的第一个商业化产品,它是JMX(Java Management extensions)的一个实现,它提供了通过Java应用程序来管理Java对象的一个框架。

  • HtmlAdaptorServer介绍

HtmlAdaptorServer在jmxtools.jar包中
它其实也是一个MBean,所以也需要注册入MBeanServer
开启HtmlAdaptorServer后,在IE输入: 

http://localhost:8092
可以看到注册的MBean,可以进行管理
http://localhost:8092开启的管理页面比较平淡,功能较少,而且是全西文的页面,说实话不太友好.
jmxtools.jar包还有后续的一些类,如:HttpBody,HtmlPage,HttpRequest,HttpResponse等类,可以进行后续的页面开发 ,不过没有太大的开发潜力(它毕竟不是前端框架).

  • JDMK HtmlAdaptor 配置步骤:
1 建立MBeanServer
2 将适配器HtmlAdaptorServer作为MBean注册入MBeanServer
3 将被管理对象(不是类是对象)作为MBean注册入MBeanServer
4 启动HtmlAdaptorServer


  • 简单的application下的JDMK HtmlAdaptorServer例子
import com.sun.jdmk.comm.HtmlAdaptorServer;

import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;

public class JmxHttpAdaptors
{
   // 为HttpAdaptor MBean   
   private int port = 8092;
   private String host = "localhost";

  
   public void start() throws JMException, MalformedURLException
   {
      // creates new server
      MBeanServer server = MBeanServerFactory.createMBeanServer("test");
     
      // 将HttpAdaptor 对象注册入MBean
      ObjectName serverName = new ObjectName("Http:name=HttpAdaptor");
      HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
      server.registerMBean(adaptor, serverName);
     

      // 设HttpAdaptor MBean(即serverName)的attributes
      if (port > 0)
      {
         server.setAttribute(serverName, new Attribute("Port", new Integer(port)));
      }
      else
      {
         System.out.println("Incorrect port value " + port);
      }   
     
      // 下面是一些测试的MBean
      // 测试类TestClass代码这里不再给出(无非就是一些简单的POJO 加减乘除之类的方法,自己编就是)
      TestClass test1 = new TestClass("t1", new URL("http://mx4j.sourceforge.net"));
      TestClass test2 = new TestClass("t1", new URL("http://www.sourceforge.net/projects/mx4j"));
      server.registerMBean(test1, new ObjectName("Test:name=test1"));
      server.registerMBean(test2, new ObjectName("Test:name=test2"));

      // 执行HttpAdaptor MBean(即serverName)的start()方法
      server.invoke(serverName, "start", null, null);
   }

   public static void main(String[] str) throws Exception
   {
      JmxHttpAdaptors thisAdaptor = new JmxHttpAdaptors();
      thisAdaptor.start();
   }
   
执行程序,查看运行效果
D:Documents and Settingsmac>netstat -an

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1025           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:6059           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:6648           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:8092           0.0.0.0:0              LISTENING
在IE输入:   
http://localhost:8092
可以看到注册的MBean,可以进行管理


  • spring 下的 JDMK HtmlAdaptorServer
1.spring 配置文件:
   <!-- 1.定义自己的bean -->
   <bean id="hello" class="com.machome.bean.Hello" />
   
    <!-- JMX configuration -->

    <!-- 2.创建一个mbeanServer bean-->
    <!--  如果你的spring是应用在容器中,则不需要此步骤,此步骤用于单独建立独立的MBeanServer中
    <bean id="mbeanServer"
          class="org.springframework.jmx.support.MBeanServerFactoryBean">
    </bean>   
    -->
       
    <!-- 3.定义assembler bean ,装配bean
        MetadataMBeanInfoAssembler是AutodetectCapableMBeanInfoAssembler 唯一实现
        spring文档中有专门介绍AutodetectCapableMBeanInfoAssembler的章节
     -->
    <bean id="assembler"
          class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
        <!-- 注入下面定义的jmxAttributeSource--> 
        <property name="attributeSource" ref="jmxAttributeSource"/>
    </bean>
       
    <!-- 4.定义 解释mbean中Annotation的bean-->
    <bean id="jmxAttributeSource"
          class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>


  <!-- 5. 定义JDMK的HtmlAdaptorServer bean --> 
    <bean id="httpJDMKAdaptor"
        class="com.sun.jdmk.comm.HtmlAdaptorServer " >
        <property name="port">
            <value>8098</value>
        </property>
    </bean>
   
   
    <!-- 6.定义MBeanExporter bean, 这是spring jmx最核心的类 -->
    <bean id="mBeanExporter" class="org.springframework.jmx.export.MBeanExporter"
    lazy-init="false" >
        <!-- 注入上面定义的assembler 两个bean注入-->
        <property name="assembler" ref="assembler"/>
       
        <!--  如果上面步骤2.你单独定义一个mbeanServer,这里需要指定,否则export bean缺省是去寻找runtime环境内的MBeanserver(通常是容器的MBeanServer)
        <property name="server" ref="mbeanServer"/>
        -->
       
        <!-- 将1.里面定义的mbean注册到mBeanExporter bean中 -->
        <property name="beans">
            <map>
                <entry key="mbean:name=hello" value-ref="hello"/>

           <!-- 将JDMK 定义的HtmlAdaptorServer的bean加入mbean map中 -->
        <entry key="MyAgent:name=jdmkadapter,port=8098" value-ref="httpJDMKAdaptor"/>
            </map>
        </property>
       
    </bean>
2。定义一个struts action (或servlet之类的)
public class SpringJMXAction extends ActionSupport {

    @Autowired
    private HtmlAdaptorServer httpJDMKAdaptor;
   
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }


    public String JDMKstart() throws Exception {
        message = "启动JDMK adaptor";
        httpJDMKAdaptor.start();
        return SUCCESS;
    }
   
    public String JDMKstop() throws Exception {
        message = "停止JDMK adaptor";
        httpJDMKAdaptor.stop();
        return SUCCESS;
    }

}
3. web.xml装载spring 配置
    <!-- ##################### 初始化spring容器  ###########-->   
    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>
               classpath:ssh-mysql.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
4.将项目部署到Tomcat后,重启Tomcat
执行步骤2.的action(或servlet)
执行程序,查看运行效果
D:Documents and Settingsmac>netstat -an

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1025           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:6059           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:6648           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:8098           0.0.0.0:0              LISTENING
 
在IE输入:   
http://localhost:8098
可以看到注册的MBean,可以进行管理

  • 网上有很多例子,其实比较容易造成误解
如下面的几段代码,是网上查询点击率最高的:
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
ObjectName adapterName = new ObjectName("HelloAgent:name=adapter,port=8082");
server.registerMBean(adapter, adapterName);
adapter.start();
很多人修改了port口8082,往往不起作用,如下:
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
ObjectName adapterName = new ObjectName("HelloAgent:name=adapter,port=8091");
server.registerMBean(adapter, adapterName);
adapter.start();
访问http://localhost:8091, 访问失败
原因:
ObjectName("HelloAgent:name=adapter,port=8082")不是用于设port口的,只是ObjectName的参数
设port口的语句是setPort(8091),如果没执行此语句,则port口缺省是8082 ,你在ObjectName()中设什么,都不会影响缺省的8082口
下面是JDMK HtmlAdaptorServer的源代码:  可以看到构造方法里直接设的就是8082
public class HtmlAdaptorServer extends CommunicatorServer
    implements MBeanRegistration, DynamicMBean
{

    public HtmlAdaptorServer()
    {
        this(8082);
    }
解决:
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
ObjectName adapterName = new ObjectName("HelloAgent:name=adapter,port=8091");
server.registerMBean(adapter, adapterName);
adapter.setPort(8091);
adapter.start();

  • 给htmlAdaptor 加入认证
import com.sun.jdmk.comm.AuthInfo;
import com.sun.jdmk.comm.HtmlAdaptorServer;

            server = MBeanServerFactory.createMBeanServer();
           
            html = new HtmlAdaptorServer();
            ObjectName html_name = new ObjectName("Adaptor:name=html,port="+PORT);
           server.registerMBean(html, html_name);
        html.setPort(PORT);
       
        AuthInfo login = new AuthInfo();
        login.setLogin("admin");
        login.setPassword("11111");
        html.addUserAuthenticationInfo(login);
这样在访问http://localhost:8092的时候,会弹出JDMK login窗口
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics