`

使用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()); 
            } 
        } 
 
         
    } 
}
分享到:
评论

相关推荐

    jmx监控weblogic,tomcat,websphere源码

    在本项目中,"jmx监控weblogic,tomcat,websphere源码"涉及了使用JMX来监控三个主流的Java应用服务器:WebLogic、Tomcat和WebSphere。这些服务器都是企业级应用部署的常见选择,对它们的监控对于确保系统性能、稳定性...

    Weblogic 9.1.x 配置秘笈

    四、Weblogic 9.1.x 的常见问题与解决方案 1. 服务器启动失败:检查日志文件,排查错误信息,可能的原因包括配置错误、依赖库缺失等。 2. 性能优化:调整服务器参数,如增大内存分配,优化JVM参数,提升并发处理能力...

    weblogic12c 安装包 fmw_12.2.1.2.0_wls_Disk1_1of1.zip

    此外,它还集成了Oracle Identity and Access Management解决方案。 5. **性能优化**:通过JRockit或JDK集成,WebLogic Server可以提供高性能的运行环境。它支持动态缓存、线程池管理和数据源连接池,以提高应用...

    WebLogic10+配置部署手册

    总的来说,《WebLogic10+配置部署手册》是一份全面而实用的参考资料,它不仅提供了WebLogic Server 10.x的详细配置和部署步骤,还可能涵盖了相关最佳实践和常见问题解决方案,是IT从业者提升WebLogic技能的宝贵资源...

    Imegrate Weblogic to Websphere.pdf

    可以配置硬件负载均衡器或使用软件解决方案(如Apache mod_proxy),确保请求在两个应用服务器间均匀分布。 8. **监控和管理**:集成后的环境需要统一的监控和管理工具。可以通过JMX(Java Management Extensions)...

    WebLogic培训资料.rar

    - 常见问题及解决方案:列举WebLogic Server运行中可能出现的问题,并给出解决建议。 通过本套培训资料,你将全面掌握WebLogic Server的使用,无论是初学者还是经验丰富的管理员,都能从中受益,提升在企业级Java ...

    WebLogic Server J2EE .rar_weblogic

    WebLogic Server是一款由甲骨文公司提供的企业级Java应用程序服务器,它是基于Java EE(Java Platform, ...通过深入研究这些材料,开发者可以更好地适应企业级开发环境,为复杂的企业应用提供可靠的解决方案。

    zabbix 2.x 安装手册

    Zabbix是一款广泛使用的开源监控软件,它能够对各种操作系统(如Linux、Windows)以及...为确保成功安装,建议仔细阅读Zabbix的官方文档,同时,保持对Zabbix社区的支持和更新跟踪,以便获取最新的解决方案和安全补丁。

    jrokit监控linux下weblogic

    【JRockit监控Linux下WebLogic】是一种针对Java应用程序,特别是WebLogic服务器的高级监控解决方案。JRockit是由Oracle开发的一款高性能、低内存消耗的Java虚拟机,特别适合用于诊断和解决内存泄漏问题。在大型企业...

    Eclipse下Weblogic配置详解

    同时,提供的文档如`weblogic.doc`和`EclipseWebLogic1.1.1.pdf`将提供更深入的指导,包括可能遇到的问题解决方案和最佳实践。 记住,配置过程可能会因Eclipse版本和WebLogic版本的不同而略有差异,所以根据实际...

    day2013-0110-webLogic配置和集群(赵强).zip

    1. 集群概念:集群是WebLogic的一种高可用性和可扩展性解决方案,将多个独立的服务器实例组合成一个逻辑单元,它们之间共享负载并提供故障转移能力。 2. 创建集群:在WebLogic管理控制台中,创建一个新的集群,为每...

    WEBLOGIC调优方案

    - 开启JMX(Java Management Extensions)以远程监控JVM和WebLogic服务器。 以上调优策略只是基础,实际调优过程需要结合具体应用环境和负载情况进行。持续监控、测试和调整是保证WebLogic服务器高效运行的关键。

    weblogic第一期培训材料

    此外,WebLogic还支持Coherence,一个分布式缓存解决方案,用于提升数据访问速度。 WebLogic作为企业级应用服务器,其深入理解和熟练操作对于IT专业人员至关重要。本次培训旨在帮助初学者快速掌握WebLogic的基础...

    Weblogic 套件和Weblogic 标准版 Weblogic 企业版 功能对比

    Oracle提供了WebLogic Standard Edition(标准版)、WebLogic Enterprise Edition(企业版)以及WebLogic Suite(套件)三种不同的版本,每个版本在功能上有所差异,旨在为用户提供最适合其业务需求的解决方案。...

    weblogic 学习资料大全

    这部分可能涉及WebLogic的高可用性解决方案,如集群、故障恢复策略、备份和恢复等。 十、WebLogic最新版本特性 随着WebLogic的版本更新,新功能和改进不断推出。学习资料可能会涵盖最新版本的特性,如支持Java EE的...

    WebLogic.doc

    WebLogic是Oracle公司的一款强大的Java企业版(JEE)...从安装配置到应用部署,再到集群管理和安全性,WebLogic都提供了完善的解决方案。通过深入了解和熟练使用这些功能,开发者可以构建出高效、安全的分布式系统。

    weblogic 错误信息详解

    WebLogic提供了一些内置的诊断工具,如JMX Console、WLST(WebLogic Scripting Tool)和JConsole,可以帮助管理员监控服务器状态,收集诊断信息,甚至执行远程操作来调试问题。 7. **社区支持** 当遇到难以解决的...

    WebLogic Server 9.2安装和操作手册

    - **性能优化**:调整JVM内存设置,启用JMX监控,优化网络配置。 ### 六、维护与更新 1. **补丁与更新**:定期检查Oracle官方发布的补丁集和更新,保持服务器安全和性能。 2. **备份与恢复**:对Domain配置和应用...

    weblogic

    2. 监控工具:介绍WebLogic内置的JMX(Java Management Extensions)监控工具和其他第三方监控解决方案。 3. 性能优化:探讨内存设置、线程池调整、应用部署优化等方面的策略,提升WebLogic的运行效率。 4. 故障排查...

Global site tag (gtag.js) - Google Analytics