通过JMX监控管理weblogic的运行(转载自http://formersam.myetang.com/main_sample/jsp/32.htm) 1.JMX概述 2.Weblogic6.1的实现 3.一个小例子 1.JMX概述 JMX(Java Management Extensions)是SUN创建的一套规范。BEA WebLogic Server实现了JMX大部分的API,并且提供了一个完全兼容JMX的控制台来管理各种资源。OPEN SOURCE的应用服务器JBoss也是基于JMX来实现。并且对之评价很高,认为是目前为止最好的软件集成工具。JBoss的成功依靠于JMX。 (载自JBoss在线文档,原文是:Our goal is to provide the full J2EE stack in the free/open world. We are already there and the reason for our success lies on JMX. JMX or Java Management eXtension is the best weapon we have found for integration of software. It provides a common spine in which we plug in modules, containers and plugins. ) 关于JMX的具体描述不是这篇短文所能完成的(我也是初学,比你知道的多不了多少)。这里只是简短的描述一下,方便大家理解。有兴趣的可以下载JMX文档(java.sun.com ) JMX specification定义的overall management architecture如下 Instrumentation level Agent level Distributed services level Additional management protocol APIs(比如SNMP协议,TMN等 ) 不考虑附加的管理协议API,整个结构分为三个层次Instrumentation level,Agent level, Distributed services level.名字我就不翻译了,以免引起误解。JMX1.0白皮书上有一张很好的图示,描述的很清楚。简要的说,Instrumentation level定义了一套被管理的资源需要遵守的规范。这里被管理资源是一个很广泛的概念。可以是一个应用程序,一个具体的类,一个服务,甚至一个硬件。不过,所有的资源都是由java语言开发的,其它的资源需要提供一个java封装。在JMX中,被管理的资源被封装为Managed Bean ,简称MBean.MBean是对所有资源的一种抽象。目前,JMX定义了四种类型的MBean:standard, dynamic, open and model MBeans.其中, open MBean ,model MBean 继承自dynamic MBean。不过,在1.0中open MBean的定义并没有完成,但是根据规范的描述,其提供的功能确实令人激动。SUN公司也承诺将来open Mbean会成为JMX产品强制实现的部分。此外,Instrumentation level还定义了JMX Notification Model以及MBean Metadata Classes。MBean通过JMX Notification Model将其状态变化的消息通知管理程序和Agent。Agent通过 Metadata获得MBean的信息。 Instrumentation level具体的细节这里不再描述。 The agent level provides a specification for implementing agents. Management agents directly control the resources and make them available to remote management applications. A JMX agent is a management entity which runs in a JVM and acts as the liaison between the MBeans and the management application. A JMX agent is composed of an MBean server, a set of MBeans representing managed resources, a minimum number of agent services implemented as MBeans, and typically at least one protocol adaptor or connector. The distributed services level provides the interfaces for implementing JMX managers. This level defines management interfaces and components that can operate on agents or hierarchies of agents. 2.Weblogic6.1的实现 weblogic6.1采用sun的JMX参考实现(在weblogic.jar里包含了com.sun.management包和javax.management包),不过自己又加入了一些新的特性。我注意到的有以下一些: a.定义接口WebLogicMBean,该接口继承了DynamicMBean(上面描述的dynamic MBean必须实现的接口),MBeanRegistration(用于MBean在Agent注册),NotificationBroadcaster(用于发送Notification,参见JMX Notification Model)。所有的weblogic的MBean都是该接口的子类。也就是说,weblogic里面所有的MBean都是dynamic MBean,当然,你也可以自己写一些standard MBean注册到weblogic的Agent上去。 WebLogicMBean主要具有以下三种类型的MBeans: Administration MBeans, 封装从config.xml读取的整个weblgoic domain的配置信息。 Configuration MBeans, 每个weblogic server一份,是Administration MBeans的copy,用于server配置自己 Runtime MBeans, 代表着运行时刻WebLogic Server的各种组件和子系统。 我们通过weblogic提供的HTMl形式的控制台对weblogic的配置操作,最终都通过调用Administration MBeans实现,在系统运行结束时写回config.xml配置文件。明白了这些,你也就完全可以写一个Swing格式的控制台或者来对weblogic进行配置。或者说,对于最终用户比较关心的JDBC数据源的信息,你完全可以自己写一个图形界面来配置。从而不让用户通过浏览器进入weblogic自己带的console进行操作。这样就可以避免用户修改一些很关键的系统信息。 在weblogic server的JMX Agent的视图里,一个EJB组件,一个JDBC数据源都是Runtime MBeans,甚至weblgoic自己的shutdown类也是一个Runtime MBeans。weblogic为各种资源定义了不同的子Runtime MBeans接口。 比如对大家都熟悉的EJB来说,就定义了接口EJBRuntimeMBean,而且更详细的是,对于不同的Bean还定义了不同子接口,比如:EntityEJBRuntimeMBean, MessageDrivenEJBRuntimeMBean, StatefulEJBRuntimeMBean, StatelessEJBRuntimeMBean。 当我们调用一个EJB的某个方法时,请求会首先送到JMX的Agent,Agnet根据请求确定要访问哪一个Runtime MBeans,然后调用该Runtime MBeans的方法,这是通过DynamicMBean的方法invoke(java.lang.String actionName, java.lang.Object[] params, java.lang.String[] signature) (actionName:要调用的方法名;params:参数数组 ;signature:该方法的型构)来实现的,invoke的返回结果就是被调用的ejb的方法的返回结果。最后,将结果返回给调用者。 b.为MBean定义了Home接口,这是JMX1.0规范所没有的,这样,对于应用程序来说就可以像访问EJB那样在远程首先通过JNDI查找该MBean的Home接口,获得Home接口后就可以获得该MBean,然后,就可以通过MBean对资源进行管理操作。这个流程与EJB几乎完全一样。 而且,更方便的是,weblogic提供了一个类weblogic.management.Helper,该类通过了一组静态方法getMBeanHome可以非常方便的得到MBeanHome对象。他的用法下面的例子将会说明 3.一个小例子 下面的程序编已通过并在weblogic 6.1运行成功。 其中getMBeanHome参数中12345678是我的weblogic 的system的用户密码,SERVER_NAME是我的weblogic的sever的名字,可以在config.xml中找到。 TestJMX执行后,将打印出我的weblogic上所有的MBean ----源程序 TestJMX.java-------------------------------------------------------------- import java.util.*; import weblogic.management.*; public class TestJMX { public MBeanHome localHome; public MBeanHome adminHome ; public static String SERVER_NAME = "myserver"; public void find() { String url = "t3://127.0.0.1:7001" ; try { localHome = (MBeanHome)Helper.getMBeanHome("system","12345678",url,SERVER_NAME); adminHome = (MBeanHome)Helper.getAdminMBeanHome("system","12345678",url); System.out.println("Local and Admin Homes found using the Helper class"); } catch (IllegalArgumentException iae) { System.out.println("Illegal Argument Exception: " + iae); } } public static void main(String[] args ) { TestJMX test = new TestJMX(); test.find(); Set allMBeans =test.localHome.getAllMBeans(); System.out.println("Size: " + allMBeans.size()); for (Iterator itr = allMBeans.iterator(); itr.hasNext(); ) { WebLogicMBean mbean = (WebLogicMBean)itr.next(); WebLogicObjectName objectName = mbean.getObjectName(); System.out.println(objectName.getName() +" isa "+mbean.getType()); } Set all2MBeans =test.adminHome.getAllMBeans(); System.out.println("Size: " + all2MBeans.size()); for (Iterator itr = all2MBeans.iterator(); itr.hasNext(); ) { WebLogicMBean mbean = (WebLogicMBean)itr.next(); WebLogicObjectName objectName = mbean.getObjectName(); System.out.println(objectName.getName() +" isa "+mbean.getType()); } } } -------------------------------------------------------------------------------------- 下面是它的运行输出结果中的部分,我们看到,从weblogic返回的 WebLogicMBean包括了几乎所有的内容。 (DBManagerDataSource是我在weblogic自己配的JDBC数据源;unix是我在weblogic自己配的一个web应用;Process_CRM是一个部署的EJB;eos10是weblogic自己实现的SNMP Agent) .... eos10 isa(n) SNMPAgentConfig eos10 isa(n) SNMPAgent unix isa(n) WebAppComponent roleejb isa(n) Application eos10 isa(n) SNMPAgentConfig DBManagerDataSource isa(n) JDBCTxDataSource .... 你也可以调用MBeanHome的getMBean方法获得自己感兴趣的某种MBean对象,具体的用法参见weblogic6.1文档得到了这些MBean的引用后,就可以设置他的属性,调用他的方法等等。而且,你还可以把他造型为更具体的子类,比如,对于SNMPAgent,你可以直接造型为SNMPAgentMBean(WeblogicMBean的子接口),这样就可以执行一些网络管理指令,获得网络管理信息(我对SNMP一窍不通,如果说的不好,见笑了),SNMPAgentMBean提供了如下操作: boolean addSNMPAttributeChange(SNMPAttributeChangeMBean attrchange) boolean addSNMPCounterMonitor(SNMPCounterMonitorMBean countermonitor) boolean addSNMPGaugeMonitor(SNMPGaugeMonitorMBean gaugemonitor) boolean addSNMPProxy(SNMPProxyMBean snmpProxy) boolean addSNMPStringMonitor(SNMPStringMonitorMBean stringmonitor) void setSNMPLogFilters(SNMPLogFilterMBean[] snmpLogFilters) void setSNMPPort(int port) void setSNMPProxies(SNMPProxyMBean[] snmpProxys) void setSNMPStringMonitors(SNMPStringMonitorMBean[] snmpStringMonitors) void setTargetedTrapDestinations(SNMPTrapDestinationMBean[] snmpTrapDestinations) void setUserDefinedMib(java.lang.String mibName 自己做一个监听类挂上去就可以实现监控,具体的接口方法参见weblogic文档 此外,还可以做的事情有,自己注册一个新的MBean到weblogic的MBean Server上。总之,通过jmx,我们可以很方便的进行对weblogic进行管理监控。这只是一个JMX的具体应用。在很多领域,JMX大有用武之地。 我对JMX以及weblogic的学习还不是很深,如果出现错误的地方,欢迎指正,我们可以讨论学习 我的mail :[email protected] ------------------------------------------------------------------------------------ 自由、平等、资源共享、Java |