原文地址: 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等类,可以进行后续的页面开发 ,不过没有太大的开发潜力(它毕竟不是前端框架).
2 将适配器HtmlAdaptorServer作为MBean注册入MBeanServer
3 将被管理对象(不是类是对象)作为MBean注册入MBeanServer
4 启动HtmlAdaptorServer
2。定义一个struts action (或servlet之类的)
3. web.xml装载spring 配置
4.将项目部署到Tomcat后,重启Tomcat
执行步骤2.的action(或servlet)
很多人修改了port口8082,往往不起作用,如下:
原因:
ObjectName("HelloAgent:name=adapter,port=8082")不是用于设port口的,只是ObjectName的参数
设port口的语句是setPort(8091),如果没执行此语句,则port口缺省是8082 ,你在ObjectName()中设什么,都不会影响缺省的8082口
下面是JDMK HtmlAdaptorServer的源代码: 可以看到构造方法里直接设的就是8082
解决:
可以看到注册的MBean,可以进行管理
http://localhost:8092开启的管理页面比较平淡,功能较少,而且是全西文的页面,说实话不太友好.
jmxtools.jar包还有后续的一些类,如:HttpBody,HtmlPage,HttpRequest,HttpResponse等类,可以进行后续的页面开发 ,不过没有太大的开发潜力(它毕竟不是前端框架).
- JDMK HtmlAdaptor 配置步骤:
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.定义自己的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> |
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; } } |
<!-- ##################### 初始化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> |
执行步骤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(); |
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窗口 |