这是来自TSS的一篇文章,以一个简单的例子说明如何在web应用中使用JMX管理你的组件。
http://www.theserverside.com/resources/article.jsp?l=JMXWebApps
一般我们使用jmx就是为了让你的资源(就是一些需要管理的bean)增加可管理性,将你需要管理的对象包装成Mbean,然后注册到MbeanServer中。我们的管理客户端通过Mbeanserver调用Mbean接口暴露的属性或操作,以达到动态管理组件的目的。大概看了一下这篇文章,简单分析一下关键在以下几点:
1。看下面Mbean实现 MyJspStats的代码 ,在构造器中通过weblogic的jndi服务得到MBeanServer并将自己注册到MBeanServer。它这里使用了weblogic服务器的Mbeanserver,这里你当然也可以创建自己的MBeanServer,将它放在Application中。
public class MyJspStats implements MyJspStatsMBean {
MBeanServer server = null; // MBeanServer
int starts = 0; // Number abandoned at start page
int selects = 0; // Number abandoned at selection
int confirms = 0; // Number abandoned before confirmation
int completions = 0; // Number of completed user Tx
Hashtable inStart = new Hashtable(); // Track user Tx started
Hashtable inSelect = new Hashtable(); // Track user Tx in select
Hashtable inConfirm = new Hashtable(); // Track user Tx in confirm
/** A no-argument constructor is necessary for Beans in JSPs **/
public MyJspStats() {
try {
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic"); // username
env.setSecurityCredentials("weblogic"); // password
Context myCtx = env.getInitialContext();
MBeanHome mbeanHome =
(MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
server = mbeanHome.getMBeanServer();
ObjectName objName =
new ObjectName(mbeanHome.getDomainName()+
":Name=MyJspStats,Type=MyJspStats");
// Register MBean so MBean can be accessed by remote managers
server.registerMBean(this, objName);
} catch (Exception ex) {
System.err.println("Cannot get MBeanServer: "+ex);
}
}
......
2。看下面在jsp中使用MyJspStats的代码,使用jsp的usebean标签在application范围内创建对象。
<jsp:useBean id="mbean" class="sample.MyJspStats" scope="application"/>
<%
mbean.updateTx(request.getSession(true), "START");
%>
<p><b>Start a Transaction</b><p>
<p><a HREF="page2.jsp">Transfer Money Between Accounts</a>
<p><a HREF="abortpage.jsp">Abort Transaction</a>
3。下面是管理页面,在管理页面上,如何取得Mbeanserver,以及调用Mbean的管理操作。
MBeanHome mbeanHome = (MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
MBeanServer server = mbeanHome.getMBeanServer();
这里以同样的方式取得MBeanServer。
server.getAttribute(objName, "Completions")
这便是取得Mbean的属性了。
<%@ page import="
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.management.ObjectName;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import javax.management.MBeanServer;
" %>
<h3>User Transaction Statistics</h3>
<table border="3"><tbody><tr>
<td><b>User Transaction Stage</b></td>
<td><b>Number of Transactions</b></td> </tr>
<%
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic"); // username
env.setSecurityCredentials("weblogic"); // password
Context myCtx = new InitialContext();
MBeanHome mbeanHome = (MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
MBeanServer server = mbeanHome.getMBeanServer();
ObjectName objName = new ObjectName(mbeanHome.getDomainName()+":Name=MyJspStats,Type=MyJspStats");
out.print("<tr><td>Completions</td><td>"
+server.getAttribute(objName, "Completions")+"</td></tr>");
out.print("<tr><td>Abandonded at Confirm</td><td>"
+server.getAttribute(objName, "Confirms")+"</td></tr>");
out.print("<tr><td>Abandonded at Select</td><td>"
+server.getAttribute(objName, "Selects")+"</td></tr>");
out.print("<tr><td>Abandonded at Start</td><td>"
+server.getAttribute(objName, "Starts")+"</td></tr>");
%>
</tbody></table>
总结例子的用法,由于在Web应用中,本身就有现成的Web服务,可以直接取得Mbeanserver,通过简单的jsp来访问。如果是在应用程序中,要通过web方式管理,就需要使用Http适配器了,同样也可以使用Rmi适配器使之可以通过远程调用的方式管理,只要将适配器同时注册到Mbeanserver中就可以了。