`
yunzhu
  • 浏览: 1140873 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:109060
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119230
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:203961
社区版块
存档分类
最新评论

监控WebLogic 8.x的解决方案(监控应用服务器系列文章)

阅读更多

前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本), 过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。为了留下点印记,给后来人留下 点经验之谈,助之少走弯路,故将这些经验整理出来,与大家分享。水平有限,难免疏漏,还望指正。如有疑问,欢迎留言,或者加入Q群参与讨 论:35526521


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

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

 

只能在JDK1.4下监控WebLogic Server 8.x

首先,上面所说的那个最头疼的问题就是——要访问WebLogic Server 8.x的MBeans,必须是在JDK1.4环境下 ,如果是JDK5+环境下会很麻烦, 原因如下 :

----------------------------------------------------------------------------------------------------------------------

因为1.4的时代JDK还没有提供javax.management包,所 以WebLogic 8.x的weblogic.jar中自己包含了javax.management包,而JDK5中也有javax.management包,JVM运行时 会优先加载JDK5中javax.management包里的类,而weblogic.jar和JDK5中javax.management的实现是不一 样的,因此会产生错误。而且weblogic8.x支持JMX 1.0,而JDK5支持JMX1.2 。

----------------------------------------------------------------------------------------------------------------------

网上有人说通过System.setProperty("jmx.serial.form", "1.0");这样的设置可以解决问题,经试验根本不行。

 

监控WebLogic Server 8.x需要的JAR包

  1、 weblogic.jar

  2、 webservices.jar

可以在%WL_HOME%\server\lib目录下找到这两个JAR包。

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

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包就可以解决这个问题了。

 

在JDK5+环境下监控WebLogic Server 8.x

如果要在JDK5+环境下监控WebLogic Server 8.x,必须写自定义classloader,屏蔽JDK自己的javax.management包,转而优先加载weblogic.jar中的 javax.management包。这可谓一大难题,但是只要对JVM的类加载机制非常熟悉就可以解决。

 

但是即使这样,还存在一个问题,通过weblogic.management.Helper得到Admin MBeanHome或Local MBeanHome的代码(已经使用自定义ClassLoader并改造成反射的方式从而使自定义ClassLoader生效),以Java Application的方式运行没有问题,但是作为Web应用部署到Tomcat以后会报异常:
----------------------------------------------------------------------------------------------------------------------

JNDI naming exception: javax.naming.NameNotFoundException: Name weblogic.management.adminhome is not bound in this Context

----------------------------------------------------------------------------------------------------------------------


具体原因不明,后来查到官方资料有这样的说法,见官方说明:

 

也就是说要通过MBeanServer接口的方式访问MBean,示例代码如下,此代码只能在JDK1.4环境下运行,要到JDK5+下运行必须使用自定义的ClassLoader,当然这些代码也要改造成用反射的方式(或者有一个“入口”是通过反射调用的,以保证处于同一ClassLoader下),这样自定义的ClassLoader才能生效:

 

String url = "t3://192.168.1.2:7001";
String username = "weblogic";
String password = "weblogic";

Hashtable props = new Hashtable();
props.put(Context.PROVIDER_URL, url);
props.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
props.put(Context.SECURITY_PRINCIPAL, username);
props.put(Context.SECURITY_CREDENTIALS, password);
InitialContext ctx = new InitialContext(props);

MBeanServer mbeanServer = (MBeanServer) ctx.lookup("weblogic.management.server");

 

 

下面展示一个较完整的Demo

package cn.chenfeng.jmx.weblogic;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import weblogic.jndi.Environment;
import weblogic.management.Helper;
import weblogic.management.MBeanHome;
import weblogic.management.configuration.DomainMBean;
import weblogic.management.configuration.ServerMBean;
import weblogic.management.runtime.RuntimeMBean;

/**
 * 使用MBeanHome的getMBeansByType和getRuntimeMBean方法获取MBean
 * @author 陈峰
 */
public class WebLogicMonitor {
	public static void main(String[] args) {
		WebLogicMonitor monitor = new WebLogicMonitor();
		try {
			monitor.collectData8();
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println();
		try {
			monitor.collectData8_3();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void collectData8() throws Exception {

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

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

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

			MBeanHome localHome = (MBeanHome) ctx
					.lookup(MBeanHome.LOCAL_JNDI_NAME);
			MBeanHome adminHome = (MBeanHome) ctx
					.lookup(MBeanHome.ADMIN_JNDI_NAME);
			System.out.println("Local MBeanHome --> DomainName : "
					+ localHome.getDomainName());
			System.out.println("Admin MBeanHome --> DomainName : "
					+ adminHome.getDomainName());
		}

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

		{
			System.out
					.println("\n===============获取DomainMBean再获取其他信息==================");
			DomainMBean domainMBean = home.getActiveDomain();
			System.out.println("DomainMBean --> Name : "
					+ domainMBean.getName());
			System.out.println("DomainMBean --> ObjectName : "
					+ domainMBean.getObjectName());

			int adminPort = domainMBean.getAdministrationPort();
			System.out.println("DomainMBean --> Administration Port : "
					+ adminPort);

			String consoleContextPath = domainMBean.getConsoleContextPath();
			System.out.println("DomainMBean --> Console Context Path : "
					+ consoleContextPath);

			ServerMBean[] servers = domainMBean.getServers();
			for (int i = 0; i < servers.length; i++) {
				ServerMBean server = servers[i];
				System.out
						.println("DomainMBean --> ServerMBean --> ObjectName : "
								+ server.getObjectName());
			}
		}

		/**
		 * JDBC连接池,根据Type获取指定类型的MBeans
		 */
		{
			System.out
					.println("\n===============获取JDBC连接池信息==================");
			Set mbeans = home.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);
			}
		}

		/**
		 * 根据Name和Type获取指定RuntimeMBean
		 */
		{
			System.out
					.println("\n===============根据Name和Type获取指定RuntimeMBean==================");
			RuntimeMBean mbean = home.getRuntimeMBean("MedRecXAPool-PointBase",
					"JDBCConnectionPoolRuntime");
			System.out.println(mbean.getObjectName());
		}

	}

	public void collectData8_3() throws Exception {
		System.out.println("=============== 获取MBeanServer ================");

		String url = "t3://192.168.1.2:7001"; // URL of the server instance
		String username = "weblogic";
		String password = "weblogic";

		Hashtable props = new Hashtable();
		props.put(Context.PROVIDER_URL, url);
		props.put(Context.INITIAL_CONTEXT_FACTORY,
				"weblogic.jndi.WLInitialContextFactory");
		props.put(Context.SECURITY_PRINCIPAL, username);
		props.put(Context.SECURITY_CREDENTIALS, password);
		InitialContext ctx = new InitialContext(props);

		MBeanServer mbeanServer = (MBeanServer) ctx
				.lookup("weblogic.management.server");

		System.out.println("MBeanServer:" + mbeanServer);

		Set jdbcMBeans = mbeanServer.queryNames(new ObjectName(
				"*:Type=JDBCConnectionPool,*"), null);
		for (Iterator itt = jdbcMBeans.iterator(); itt.hasNext();) {
			Object jdbcMBean = itt.next();
			System.out.println(jdbcMBean);
		}
	}
}

 


  • 大小: 62.3 KB
1
1
分享到:
评论
5 楼 yy8093 2015-07-07  
自定义classloader要怎么弄、
4 楼 yunzhu 2013-11-26  
innovatedigital 写道
采用JAVA 类加载器兼容旧版本,调试起来的确比较花费时间。
研究了几个监控解决方案,有2个简单方法可讨论:
1,直接采用jdk1.4,做数据采集weblogic8, 采用jdk1.5+采集weblogic9+,著名的开源软件 Hyeprc HQ 采用此方法,不足是在一个被监控的机器上,只能运行一个版本的weblogic, 这在大部分生产环境下,还是可以满足的。
http://www.innovatedigital.com/htm_speek/Hyperic_weblogic.asp

2,采用jvm进程间通讯,由一个统一的JVM 调用相应版本的JVM,虽然耗费资源,性能有些影响,但是对于weblogic8的那几个指标,还是可以接受的。Oracle的一些管理工具对于收购的一些产品,大都采用这种方式。Dell Foglight 的插件,采用了此方式:
http://www.innovatedigital.com/node/944


这两种方式,实现起来都比较直接。

很专业啊,第二种方案比较高级,可惜那时候不知道这种技术。
不过采用重写类加载器的方案,调试起来也不麻烦,监控weblogic8的部分的代码完全是单独的,只是调用的时候,入口是通过自定义类加载器加载进来并通过反射启动的而已。
3 楼 innovatedigital 2013-11-25  
采用JAVA 类加载器兼容旧版本,调试起来的确比较花费时间。
研究了几个监控解决方案,有2个简单方法可讨论:
1,直接采用jdk1.4,做数据采集weblogic8, 采用jdk1.5+采集weblogic9+,著名的开源软件 Hyeprc HQ 采用此方法,不足是在一个被监控的机器上,只能运行一个版本的weblogic, 这在大部分生产环境下,还是可以满足的。
http://www.innovatedigital.com/htm_speek/Hyperic_weblogic.asp

2,采用jvm进程间通讯,由一个统一的JVM 调用相应版本的JVM,虽然耗费资源,性能有些影响,但是对于weblogic8的那几个指标,还是可以接受的。Oracle的一些管理工具对于收购的一些产品,大都采用这种方式。Dell Foglight 的插件,采用了此方式:
http://www.innovatedigital.com/node/944


这两种方式,实现起来都比较直接。
2 楼 yunzhu 2012-06-07  
Dead_knight 写道
很早之前也搞过这玩意
http://dead-knight.iteye.com/blog/853008

主要是服务卡死、jvm不足等等问题能及时短信提醒维护人员进行处理。其次就是能监控到队列,可以把耗时的队列记录到日志里,方便性能优化


呵呵,我们做的这个一大堆的软件硬件都要监控
1 楼 Dead_knight 2012-06-07  
很早之前也搞过这玩意
http://dead-knight.iteye.com/blog/853008

主要是服务卡死、jvm不足等等问题能及时短信提醒维护人员进行处理。其次就是能监控到队列,可以把耗时的队列记录到日志里,方便性能优化

相关推荐

    使用sitescope监控weblogic服务

    Mercyry SiteScope是一款无代理监测解决方案,可确保分布式IT基础架构——如服务器、操作系统、网络设备、网络服务、应用和应用组件的可用性和性能。这款主动的、基于Web界面的基础架构监测解决方案是非常简洁的,...

    springboot参考指南

    解决自动配置问题 ii. 62.2. 启动前自定义Environment或ApplicationContext iii. 62.3. 构建ApplicationContext层次结构(添加父或根上下文 iv. 62.4. 创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. ...

    电信系统BMC方案建议书

    • BMC监控解决方案设计方法 8 2.1.1 BMC PATROL体系结构 9 • BMC管理解决方案实现的功能 9 2.1.2 管理平台 9 2.1.3 运行统计报告 10 2.1.4 操作系统管理 10 2.1.5 Oracle数据库管理 11 2.1.6 中间件管理 11 2.1.7 ...

    基于SSHI架构的开发平台技术方案

    基于J2EE平台软件的终级解决方案,采用最新的J2EE...平台集成系统管理模块,包括:(1)服务器系统信息监控 (2)组织机构管理 (3)用户管理 (4)角色管理 (5)资源菜单管理 (6)数据字典管理 (7)在线用户管理(8)应用级缓存管理

    Loadrunner报错日志

    1、首先检查是不是连接weblogic服务过大部分被拒绝,需要监控weblogic的连接等待情况,此时需要增加acceptBacklog,每次增加25%来提高看是否解决,同时还需要增加连接池和调整执行线程数,(连接池数*Statement ...

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

    soa_rest_api:适用于 Oracle SOA Suite 的 REST API - 用 JRuby 编写并使用 Rails

    提供用于访问 Oracle WebLogic 服务器的管理 Bean 的 REST API 的 Rails 应用程序。 托管 bean (MBean) 是提供 Java 管理扩展 (JMX) 接口的 Java bean。 JMX 是用于监视和管理网络资源的 J2EE 解决方案。 与 SNMP ...

    java 面试题 总结

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....

    Java数据编程指南

    软件、对象、数据设计与建模 第1章 软件开发的方法与过程 为什么我们需要方法与过程 什么是软件方法与过程 方法的内容 过程模型 源代码管理的要素 软件缺陷与修改的跟踪和解决方案 软件品质...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是...

Global site tag (gtag.js) - Google Analytics