使用JMX监控WebLogic 8.x的解决方案

在写WebLogic监控程序的过程中,可以说是相当坎坷,因为因为我要支持监控WebLogic不同版本,而WebLogic不同版本对JMX的支持却有着不小的区别,在网上也没有找到完整的解决方案,所以只能自己一点点的摸索,如今终于拨云见日了,OMG。在此,我们只探讨监控WebLogic 8.x的解决方案,其他版本后续跟进,我会整理出一个完整的文章。为什么监控WebLogic 8.x要先单独写个文章呢——因为8.x跟新的9.x和10.x不一样,刚开始入手会遇到很麻烦的问题。如果我入手之前能看到这篇文章,嘿嘿,那就谢天谢地了。

好了,不啰嗦了,我们开始:

首先第一条,要访问WebLogic Server 8.x的MBeans,必须是在JDK1.4环境下,否则会很麻烦(需要写自己classloader),原因如下:

Java代码
因为WebLogic 8.x的weblogic.jar中有自己的javax.management包,而JDK1.5中也有javax.management包(以前版本没有),运行时会优先调用JDK1.5中javax.management包里的类,因此产生错误。
而且weblogic8.x支持JMX 1.0,而JDK1.5支持JMX1.2 。
网上有人说通过System.setProperty("jmx.serial.form", "1.0");这样的设置可以解决问题,经试验根本不行。

使用JMX访问WebLogic Server 8.x的MBeans,需要使用的JAR包是weblogic.jar、webservices.jar
可以在%WL_HOME%\server\lib目录下找到。


如果只加入weblogic.jar包,有些API可以访问,但是运行MBeanHome->getAllMBeans()方法获取所有MBean时会抛异常:

Java代码
weblogic.rjvm.PeerGoneException: ; nested exception is:
weblogic.utils.NestedException: Ljavax/xml/soap/SOAPException; - with nested exception:
[java.lang.NoClassDefFoundError: Ljavax/xml/soap/SOAPException;]
at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:164)
at weblogic.management.internal.AdminMBeanHomeImpl_815_WLStub.getAllMBeans(Unknown Source)
at cn.chenfeng.jmx.weblogic.ListAllMBeans.main(ListAllMBeans.java:27)
Caused by: weblogic.utils.NestedException: Ljavax/xml/soap/SOAPException; - with nested exception:
[java.lang.NoClassDefFoundError: Ljavax/xml/soap/SOAPException;]
at weblogic.rjvm.RJVMImpl.gotExceptionReceiving(RJVMImpl.java:967)
at weblogic.rjvm.ConnectionManager.gotExceptionReceiving(ConnectionManager.java:930)
at weblogic.rjvm.t3.T3JVMConnection.hasException(T3JVMConnection.java:870)
at weblogic.socket.SocketMuxer.deliverExceptionAndCleanup(SocketMuxer.java:588)
at weblogic.socket.SocketMuxer.deliverHasException(SocketMuxer.java:544)
at weblogic.socket.JavaSocketMuxer.processSockets(JavaSocketMuxer.java:306)
at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:32)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
--------------- nested within: ------------------
weblogic.rmi.extensions.RemoteRuntimeException: Unexpected Exception - with nested exception:
[weblogic.rjvm.PeerGoneException: ; nested exception is:
weblogic.utils.NestedException: Ljavax/xml/soap/SOAPException; - with nested exception:
[java.lang.NoClassDefFoundError: Ljavax/xml/soap/SOAPException;]]
at weblogic.management.internal.AdminMBeanHomeImpl_815_WLStub.getAllMBeans(Unknown Source)
at cn.chenfeng.jmx.weblogic.ListAllMBeans.main(ListAllMBeans.java:27)


加入webservices.jar包就可以解决问题了。

下面展示一下我自己跑的Demo


Java代码
package cn.chenfeng.jmx.weblogic;

import java.util.Iterator;
import java.util.Set;

import javax.naming.Context;

import weblogic.jndi.Environment;
import weblogic.management.Helper;
import weblogic.management.MBeanHome;
import weblogic.management.WebLogicMBean;
import weblogic.management.WebLogicObjectName;
import weblogic.management.runtime.RuntimeMBean;

public class JMXDemo1 {

public static void main(String[] args) throws Exception {

final String providerUrl = "t3://192.168.1.2:7001";
final String username = "chenfeng";
final String password = "chenfeng";

MBeanHome adminHome = (MBeanHome) Helper.getAdminMBeanHome(username,
password, providerUrl);
System.out.println("DomainName : " + adminHome.getDomainName());

/*
* 获取MBeanHome的另一个方法,Helper内部就是通过这种方法实现的
*/
{
Environment env = new Environment();
env.setProviderUrl(providerUrl);
env.setSecurityPrincipal(username);
env.setSecurityCredentials(password);
Context ctx = env.getInitialContext();

MBeanHome localHome2 = (MBeanHome) ctx
.lookup(MBeanHome.LOCAL_JNDI_NAME);
MBeanHome adminHome2 = (MBeanHome) ctx
.lookup(MBeanHome.ADMIN_JNDI_NAME);
System.out.println("DomainName : " + localHome2.getDomainName());
System.out.println("DomainName : " + adminHome2.getDomainName());
}

{
Set mbeans = adminHome.getMBeansByType("ServerRuntime");
System.out.println("ServerRuntime MBeans : " + mbeans);
}

/*
* JDBC连接池
*/
{
System.out
.println("\n===============获取JDBC连接池信息==================");
Set mbeans = adminHome.getMBeansByType("JDBCConnectionPoolRuntime");
System.out.println("JDBCConnectionPoolRuntime MBeans : " + mbeans);

Iterator itt = mbeans.iterator();
while (itt.hasNext()) {
RuntimeMBean mbean = (RuntimeMBean) itt.next();
String name = mbean.getName();
int count = Integer.parseInt(mbean.getAttribute(
"ActiveConnectionsCurrentCount").toString());
System.out.println("【JDBCConnectionPoolRuntime --> " + name
+ " --> ActiveConnectionsCurrentCount】: " + count);
}
}

/*
* 线程池
*/
{
System.out.println("\n===============获取线程池信息==================");
Set mbeans = adminHome.getMBeansByType("ThreadPoolRuntime");
System.out.println("ThreadPoolRuntime MBeans : " + mbeans);

Iterator itt = mbeans.iterator();
while (itt.hasNext()) {
RuntimeMBean mbean = (RuntimeMBean) itt.next();
String name = mbean.getName();
int count = Integer.parseInt(mbean.getAttribute(
"ExecuteThreadIdleCount").toString());
System.out.println("【ThreadPoolRuntime --> " + name
+ " --> ExecuteThreadIdleCount】: " + count);
}
}

/*
* 获取所有的MBean信息
*/
{
System.out
.println("\n===============打印从AdminHome获得的所有MBean==================");
Set allMBeans = adminHome.getAllMBeans();
System.out.println("MBean的总数目:" + allMBeans.size());
for (Iterator itr = allMBeans.iterator(); itr.hasNext();) {
WebLogicMBean mbean = (WebLogicMBean) itr.next();
WebLogicObjectName objectName = mbean.getObjectName();
System.out.println(objectName.getName() + " is a(n) "
+ mbean.getType());
}
}


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值