针对开发人员的利用WebLogic Server进行应用程序托管,第5部分

来源:百度文库 编辑:神马文学网 时间:2024/05/02 10:27:11

本文是针对开发人员的BEA WebLogic Server管理和托管系列文章的第五篇。(参见WLDJ,第2卷,第10–12期;第3卷,第2期)。我们已经讨论了WebLogic Server的管理概念和术语、用于包装应用程序和创建并配置WebLogic Server域的图形化工具。

       本文是针对开发人员的BEA WebLogic Server管理和托管系列文章的第五篇。(参见WLDJ,第2卷,第10–12期;第3卷,第2期)。

我们已经讨论了WebLogic Server的管理概念和术语,用于包装应用程序和创建并配置WebLogic Server域的图形化工具;应用程序部署,运行时管理,以及无需了解JMX就可获得的监视工具;JMX的基本概念和术语以及BEA WebLogic Server 8.1 JMX基础结构;还有如何使用与WebLogic Server 8.1一起提供的JMX特殊工具。在上一篇文章中,我们展示了如何编写自定义Java 应用程序的基本知识,这些Java程序使用JMX配置、管理和托管基于WebLogic Server 8.1的应用程序。

本月,我们将继续讨论JMX编程,向大家展示如何使用通知工具创建通知监听程序(listener)、监视程序(monitor)和定时程序(timer)。

JMX 通知
除了具有操纵MBean属性和操作的能力之外,当MBean状态被改变时JMX还提供了通知(notification)。JMX MBeanServer允许托管程序在单独的MBean或MBeanServer自身上的这些通知中注册它所关心的内容。若要在JMX通知中注册所关心的内容,程序只需创建实现NotificationListener接口的对象,然后在MBean或MBeanServer上注册该对象即可。NotificationListener接口只有一个方法,即handleNotification(),MBean调用该方法来通知监听程序:

public interface NotificationListener
extends java.util.EventListener
{
void handleNotification(Notification n, Object handback);
}

Notification类包含了围绕该事件的有关环境信息。当注册监听程序时,可选的回传参数(handback)只简单地回传被传递到方法中的对象。这就提供了一种机制,使得监听程序可以关联正在产生通知的MBean的信息,通知回传给监听程序,并且在通知回调的过程中不进行修改。

JMX 1.0定义了五种类型的通知对象,对象中包含了与特定通知类型相关的信息:

·         MBeanServerNotificationMBeanServer用于通知MBean的监听程序进行注册或取消注册。

·         AttributeChangeNotification当一个属性值改变时,MBeans用于通知监听程序。

·         MonitorNotification当满足一组特定条件时,由监视服务发出。

·         RelationNotification当一个关系被增加、修改或删除时,由关系服务发出。

·         TimerNotification当定时程序计时时间到时,由定时程序服务发出。

除此之外,BEA WebLogic Server 8.1还定义了下面的通知类型:

·         WebLogicLogNotification每当WebLogic Server日志文件写入一个条目时,发出该通知。

·         AttributeAddNotification每当向一个数组类型的MBean属性中增加一个元素时,发出该通知 。

·         AttributeRemovedNotification每当从一个数组类型的MBean属性中删除一个元素时,发出该通知 。

清单1是一个监听程序的非常简单的例子,它除了只是打印AttributeChangeNotification的细节之外,不做任何事情。

在这里,我们需要注意两点。首先,您将注意到我们已经使类成为可序列化的。通知监听程序机制,就像其他JMX接口,没有解决远程访问问题。为了能够使用我们独立运行的客户端注册监听程序,需要使监听程序成为可序列化的,因为对于addNotificationListener()的调用需要将监听程序的一个副本传递给服务器。这就意味着,我们刚刚创建的监听程序只是作为服务器的一个实例,而只有服务器端的监听程序副本才真正接收到通知。实际上,为了使上面的工作得以进行,您必须确保监听程序类存在于服务器的CLASSPATH中。幸运的是,BEA WebLogic Server提供了一个扩展,它允许很容易地创建和注册一个运行于远程过程中的监听程序。

为了启用远程监听程序通知,您所要做的全部工作就是改变上面的类来实现weblogic.management.RemoteNotificationListener接口,以替代javax.management.NotificationListener和java.io.Serializable接口。这就取消了需要监听程序类位于服务器的CLASSPATH中的要求,并且允许通知被传送回您的客户端监听程序。

其次,您必须通过检查传递到监听程序的实际的通知对象类来过滤所感兴趣的通知的类型。这一点在我们的小例子中并不重要,但是您可以想象为:随着对监听程序需要管理的通知类型数量的逐渐增加,它将变得更加笨拙难用。幸运的是,JMX定义了过滤机制,允许注册程序描述监听程序希望接收到的事件的类型。所有的通知过滤器必须实现如下的javax.management.NotificationFilter接口:

public interface NotificationFilter extends java.io.Serializable
{
public boolean isNotificationEnabled(Notification notification);
}

如果通知应当被发送给过滤器,isNotificationEnabled()方法返回true,否则返回false。请注意,NotificationFilter接口扩展了java.io.Serializable。与前面描述过的NotificationListener接口非常相像,该过滤器将被复制到服务器并在服务器上进行实例化。在这种情况下,那正是我们所需要的,因为我们希望服务器仅将感兴趣的事件回传给客户端。现在,我们可以将过滤逻辑从监听程序中去掉,将其放入过滤器中(参见清单2)。

当然,您可以使用过滤器做比这复杂得多的事情,但是对于这一问题的完整论述已经超出了本文的范围。请参考JMX 1.0规范(http://jcp.org/aboutJava/communityprocess/final/jsr003/)和BEA WebLogic Server文档(http://edocs.bea.com/wls/docs81/jmx/notifications.html),以获取更多信息。

若要在MBean上注册通知监听程序,只要简单地调用MBeanServer上的addNotificationListener()方法,或者如果您正在使用WebLogic Server的强类型MBean接口,则调用每个WebLogic Server MBean 都能实现的javax.management.NotificationBroadcaster接口定义的addNotificationListener()方法。下面来自于可下载的示例的代码片段(可从www.sys-con.com/weblogic/sourcec.cfm获得)演示了如何使用MBeanServer接口:

String serverName = "mydomain:Name=myserver,Type=Server";
ObjectName serverMBeanName = new ObjectName(serverName);
MyAttributeChangeListener me =
new MyAttributeChangeListener(serverName);
MyAttributeChangeFilter filter = new MyAttributeChangeFilter();
mbeanServer.addNotificationListener(serverMBeanName, me, filter, null);

利用JMX Notification,已注册的监听程序可以在每次它所感兴趣的事件发生时,收到通知。如果管理应用程序确实想监视一个MBean属性的值,JMX提供另一个称为JMX Monitoring的工具来完成这一工作。

JMX Monitoring
JMX规范要求JMX MBean服务器必须提供一个监控服务。JMX Monitoring通过一组称为Monitor MBeans的MBeans来实现。管理应用程序配置这些Monitor MBeans以便周期性地观测其它MBeans,并且如果一个给定的MBean属性超过了配置的阈值,将发出一个JMX通知。被观测的属性值,被称之为派生的测量值(derived gauge),可以是该属性的准确值,也可以是两个连续观测值之差(如果该属性是数值型的)。监视程序对被观测属性值采样的频率称为粒度周期(granularity period)。

流行的Monitor MBeans有三种类型:

·         CounterMonitor观测行为类似计数器(counter)的整数类型属性,因为属性值总是大于或等于零,而且属性值只增加(尽管它们可以翻转(rollover)) 。

·         GaugeMonitor观测行为类似测量值(gauge)的数值型属性,因为属性值可以任意变动 。

·         StringMonitor观测字符串类型属性 。

每当派生的测量值的值超过配置阈值,Monitor MBean就产生一个JMX通知。这些通知使用一个MonitorNotification类的实例发送,该类是以前讨论的Notification类的子类。该类包含诸如通知类型、被观测的MBean名字、被观测的属性名字、派生的测量值以及触发通知的阈值。与正在使用的监视程序类型相关的监视程序的通知类型有:

·         jmx.monitor.counter.threshold当CounterMonitor的派生的测量值达到或超过配置阈值时,产生该通知 。

·         jmx.monitor.gauge.high当GaugeMonitor的派生的测量值达到或超过配置阈值上限时,产生该通知 。

·         jmx.monitor.gauge.low当GaugeMonitor的派生的测量值减少到或低于配置阈值下限时,产生该通知 。

·         jmx.monitor.string.matches当StringMonitor的派生的测量值第一次与所比较的配置字符串匹配时,产生该通知  。

·         jmx.monitor.string.differs当StringMonitor的派生的测量值第一次与所比较的配置字符串不相同时,产生该通知 。

当遇到特定的出错条件时,也会产生通知。错误类型的常见集合为:

·         jmx.monitor.error.mbean当被观测的MBeans之一未在MBean服务器上注册时,产生该通知。

·         jmx.monitor.error.attribute当被观测的属性在某个MBeans中不存在时,产生该通知 。

·         jmx.monitor.error.type当被观测的属性值是null或属性类型与正在使用的监视程序类型不匹配时,产生该通知 。

·         jmx.monitor.error.runtime当获取被观测属性值的过程中遇到其它错误时,产生该通知 。

·         jmx.monitor.error.threshold当配置的阈值参数与被观测属性类型不相同时,计数器监视程序或测量值监视程序产生该通知 。

要想使用一个监视程序,您需要创建相应Monitor MBean的一个实例,并在MBean服务器上进行注册、配置、增加一个或多个监听程序,然后启动监视程序。创建Monitor Mbean涉及:为新的MBean创建一个名字,然后调用MBeanServer上的一个createMBean()方法:

String monitorName = "mydomain:Name=MyMonitor";
ObjectName monitorMBeanName = new ObjectName(monitorName);
ObjectInstance oiMonitor =
mbeanServer.createMBean("javax.management.monitor.GaugeMonitor", monitorMBeanName);

使用MBeanServer.createMBean()方法也能在MBean服务器上注册MBean。接下来,我们需要使用相应的属性或操作来配置Monitor Mbean。在JMXMonitor示例中,我们使用了一个GaugeMonitor,并用了MBeanServer.setAttributes()方法配置其属性(参见清单3)。

下一步,我们调用setThresholds()操作:

Object[] params = new Object[2];
params[0] = new Integer(10);
params[1] = new Integer(1);
String[] signature = new String[2];
signature[0] = "java.lang.Number";
signature[1] = "java.lang.Number";
Object retval = mbeanServer.invoke(monitorMBeanName, "setThresholds", params, signature);

然后我们为监视程序增加监听程序:

MyMonitorListener me = new MyMonitorListener();
mbeanServer.addNotificationListener(monitorMBeanName,
me, null, null);

最后,我们启动监视程序:

params = new Object[0];
signature = new String[0];
retval = mbeanServer.invoke(monitorMBeanName, "start", params, signature);

现在,每当weblogic.kernel.Default的PendingRequestCurrentCount属性执行队列第一次超过10或第一次低于1时,一个通知消息将被发送到监听程序。一旦一个应用程序完成了监视程序,它应当终止该监视程序并从MBean 服务器上取消注册:

retval = mbeanServer.invoke(monitorMBeanName, "stop",
params, signature);
mbeanServer.unregisterMBean(monitorMBeanName);

如果未做完上面的工作,应用程序下一次启动时就会失败,除非它为Monitor MBean使用了不同的名字,或服务器已经重启了。若要获取关于JMX监视程序的更多信息,请参考JMX 1.0规范以及Javadoc。JMX提供了一个称为JMX Timer服务的最后通知机制(final notification mechanism),它提供了在给定的日期和时间、甚至在定期的时间间隔到达时被通知的能力。

JMX Timers
 JMX Timer服务以两种不同的方式产生通知:

·         只产生一次的通知 。

·         在一段给定的时间内或给定的发生次数内于定期间隔发生的重复的通知。

与监视程序MBean类似,Timer MBean在MBeanServer上创建,并进行配置以产生这些定时通知。Timer MBean产生的通知使用TimerNotification类的实例进行发送。若要创建通知,可以使用Timer MBean的addNotification()方法,该方法需要以下的一些或全部参数:

·         type用于表示通知类型的字符串 。

·         message用于发送关于通知的详细信息的字符串。

·         userData可选的回传对象 。

·         date用于指定通知应当何时发生的日期类 。

·         period通知之间以毫秒为单位的时间间隔(0或null表示无重复的通知) 。

·         nbOccurences通知将要发生的总次数(0或null意味着,如果周期是0或null则该通知无限次地重复)。

用于创建、配置、添加到监听程序、以及启动Timer MBean的代码与前面我们讨论JMX监视程序时使用的代码非常类似。同样,当您的Timer Mbean已经完成时,您的应用程序应当终止并将Timer Mbean取消注册,这样一来当以相同名字再次创建MBean时才不会引起命名冲突。在这里没有列出有关代码,请参考可下载的示例。

结束语
在本文中,我们展示了如何使用JMX通知、监视程序以及定时程序。JMX通知为应用程序提供了注册感兴趣的特定事件并在事件发生时接收回调的能力。使用有NotificationListener接口的JMX通知,提供了一个简单的机制来检测由MBeans产生的预定义事件。监视程序提供了更复杂方法来观测一个MBeans属性值,并在属性值超过配置阈值时接收通知。JMX Timer提供一种机制,用于在未来的日期和时间产生通知,或以在周期性的时间间隔产生通知。这些JMX服务提供了一个管理应用程序,它具有监视托管应用程序的行为以及在无人干预的情况下响应变化的能力。

该系列文章的下一篇,也是最后一篇,将致力于讨论创建自定义MBeans和扩展Admin Console以显示它们的详细内容。

相关站点
· Source Code
· Source Code Extra ( zip file)

 作者简介 Robert Patrick是BEA的CTO Office的技术总监,也是Mastering BEA WebLogic Server: Best Practices for Building and Deploying J2EE Applications一书的作者之一。Robert的职业生涯致力于使用BEA Tuxedo 和 BEA WebLogic Server来帮助客户设计、构建和部署高性能、容错性强和任务关键型的分布式系统。 Vadim Rosenberg是BEA WebLogic Server的产品市场经理。在加入BEA之前,他有13年从事商业软件工程的经验,最近的工作是在Compaq Computers (Tandem Division)开发容错性强和高度可扩展的J2EE框架。
针对开发人员的利用WebLogic Server进行应用程序托管,第5部分 针对开发人员的WebLogic Server应用管理,第 6 部分使用 JMX 自定义应用程序管理 针对开发人员的WebLogic Server应用管理,第 2 部分 针对开发人员的WebLogic Server应用管理,第 1 部分----基本概念和配置工具 为 WebSphere Application Server Community Edition 开发 Spring 应用程序: 第 2 部分:使用 Spring 进行数据库连接管理 在BEA WEBLOGIC PORTAL中进行AJAX编程,第1部分 在BEA WEBLOGIC PORTAL中进行AJAX编程,第1部分 为 WebSphere Application Server Community Edition 开发 Spring 应用程序: 第 1 部分:Spring MVC 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应 第 4 部分 利用 DOM 进行 Web 响应 (1) 第 4 部分 利用 DOM 进行 Web 响应 (2) 使用 HTML 5 创建移动 Web 应用程序,第 2 部分: 使用 HTML 5 开启移动 Web 应用程序的本地存储 Spring与WebLogic Server的集成 Spring与WebLogic Server的集成 WebLogic Server 的最佳调整建议 Spring与WebLogic Server的集成 开发端到端的 Ajax 应用程序,第 3 部分: 集成、测试、调试应用程序 SCA 应用程序开发,第 3 部分: 开发示例 SCA 应用程序 面向Java开发人员的Ajax: 构建动态的Java应用程序 掌握 Ajax,第 6 部分: 建立基于 DOM 的 Web 应用程序 开发端到端的 Ajax 应用程序,第 1 部分: 用一个场景设置 Ajax 环境 开发端到端的 Ajax 应用程序,第 2 部分: 实现 Ajax 客户机和服务器层