龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

基于JMX通知框架的AJAX深度开发(1)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
本文中,我们使用BEA WebLogic 8.1用作这些软件的发布平台,尽管这里的架构和方法也适用于其它J2EE应用程序服务器。 一、关键需求 针对于企业Java和J2EE应用程序的系统管理栈形成了问题

本文中,我们使用BEA WebLogic 8.1用作这些软件的发布平台,尽管这里的架构和方法也适用于其它J2EE应用程序服务器。

一、关键需求

针对于企业Java和J2EE应用程序的系统管理栈形成了问题解析管道的一部分-在此,Java/J2EE应用程序与一个管理层进行交互以监视潜在的问题,例如应用程序服务器线程饥饿,堆溢出或到一个数据库的陈旧连接等。

管理层通常包括JMX Mbeans-要装配并使用哪个应用程序,以及其它一些产品例如读取这些JMX属性的Wily Introscope和HP OpenView-如果超过一个事先配置的门槛值,那么它能够从Wily中得到警告。

这个模型存在一个问题-如果系统在后台出现问题的话,针对JMX管理的服务器端模式将无法帮助浏览器端客户,因为这种模型全部是以服务器为中心的。例如,如果一新的J2EE Web应用程序要被发布或该应用程序在几分钟内将要关闭-因为Wily检测到一个问题,那么在浏览器上的用户并不知道发生了这么紧迫的管理事件!

通过全面地允许用户进入问题解析管道,系统管理员可以管理终端用户体验-通过把管理信息广播到用户基并在一定程度上控制用户的行为来实现。

为了通过HTTP协议实现把管理信息传递给客户,存在这样一个问题:如果客户端用户不是公开地使用GET或POST更新页面而是偷偷地更新一隐蔽的框架,那么管理方面如何把管理信息发送到一个HTTP客户?

二、方案描述

本文要实现一简单的AJAX脚本,它将从MBean服务器取得以XML消息形式的管理信息并经由一个servlet解决这个问题。这些管理信息必须被加以管理并且被反馈到所有的参与其中的能够接收AJAX请求的应用程序服务器。

在服务器端:

一个J2EE应用程序服务器簇用于服务于来自基于浏览器的用户和在线事务处理(OLTP)用户基(例如有两个或四个服务器)的请求。通过使用一个第三方Web服务器,用户请求被跨越该簇(OLTP簇)平衡装载。

一个标准MBean(UserWeb)用于存储管理信息,如加上元数据属性的管理消息。该Mbean宿主在J2EE"管理"服务器和在OLTP簇上的J2EE服务器上。

在管理服务器上,由系统管理员使用针对JMX的HTMLAdaptor来设置警告状态,重试间隔(在相邻XMLHttp-Requests之间的间隔)以及警告消息-例如"System Down in 10 Minutes."。然后,管理员把该状态广播到管理服务器上的Mbeans-由该管理服务器来把它们的状态重置到master管理状态。

在客户端:

支持AJAX的客户端使用一个XMLHttpRequest(它调用一个servlet以返回XML消息形式的相关的MBean值)来检索状态、重试间隔和消息。

然后由客户端JavaScript分析这个XML消息,重置重试间隔并且用管理消息重画屏幕的一部分。

在retry-interval秒之后,该客户进行另外一个XMLHttpRequest并且客户周期再次开始。

三、 基本架构

图1显示出全面的解决方案体系结构,其中表1描述了相应的基本架构元素。


图1 方案架构

元素描述标准MBean(UserWeb)用于警告状态和消息的属性,还有getter/setters和一个方法来广播(通知)MBean状态MBean助理(UserWebMBeanHelper)包装装配的代码以便于使用UserWeb MBeanMBean服务器J2EE容器内的MBean服务器Servlet(Admin.java)装配的Servlet,基于UserWebMBean的内容格式化XML响应事件听者(ManagementListener.java)Singleton-它用管理服务器上的UserWeb MBean把自己注册为一个"alert.broadcast"类型事件的听者客户端AJAX引擎(admin.js)用于管理XMLHttpRequest-/-repaint周期的JavaScript客户端描述(main.jsp)装配的JSP。AJAX基于MBean属性启动该页面HTML适配器包装器(StartHTMLAdaptor.java)在听端口+100启动一个HTMLAdaptorServer以实现到MBeans的HTTP存取表1 架构元素

(一) JMX通知模型

这个模型包含两个部件:

MBean-为本地和远程注册的听者激活事件

听者-它用MBean注册自己以听取由该MBean所产生的事件

第一个由UserWeb Mbean来实现,第二个由ManagementListener来实现。

(二) 管理用户信息的JMX MBean

UserWeb标准的MBean是一个简单类-它包含关键的属性和方法(表2)。

元素描述AlertEnabled如果AlertStatus>-1,则为真AlertMessage用户将在屏幕上看到的信息AlertReady如果AlertStatus>0,则为真CallBack在每两个XMLHttpRequest之间的毫秒数BroadcastState方法-它用一个事件(alert.broadcast)(它把Mbean状态作为事件数据传递)来通知在本地/远程JVM上的所有已注册的听者表2 UserWeb Mbeam属性和方法

(三) 事件听者

Singleton ManagementListener类实现了Weblogic.management.RemoteNotificationListener-它扩展了javax.management.NotificationListener和java.rmi.Remote以允许在一个远程WebLogic JVM上的事件通过使用RMI技术被通知到远程听者。
在应用程序服务器启动时,在每个JVM上的一个听者用管理服务器上的UserWeb MBean注册自己。

(四) MBean助理

使用一个助理类来对Mbeans加以包装是个不错的注意。这样,我们可以从装配的代码中调用这个助理从而调用MBean方法。
UserWebMBeanHelper类被用作UserWeb Mbean的包装。所有助理的祖先是ApplicationMBeanHelper,它负责:

查找本地和远程MBean服务器

调用这些服务器以取得/设置MBean属性并且调用MBean方法

为了确保相匹配,MBean和MBean助理都实现接口UserWebMBean。

(五) 装配Servlet

一个应用程序可以被装配以使用JMX。用AOP术语来说就是,把管理方面织入到应用程序代码中。本文中第一个JMX装配点是一个HTTPServlet。这个servlet是AJAX请求的目标,并且它实现一个控制器模式-它可以被精心制作以使用简单的请求参数来处理其它AJAX请求。
从一个MVC的角度来看,该模型是UserWeb Mbean,视图是支持AJAX的(JSP)页面,而控制器是被装配的servlet。

(六) 客户端AJAX引擎

这是一组JavaScript函数,它们:

管理XMLHttpRequest并且响应处理重复性操作

分析由XMLHttpRequest返回的XML消息

用XML消息内容重画屏幕

客户描述

这是main.jsp页面-它包含客户端AJAX引擎和可重画的部分。

(七) 序列

实质上,服务器端序列参与管理管理属性的设置并且把这些属性广播到所有的感兴趣(听)的JVM上。而,客户端序列参与检索这些属性并且以管理指定的间隔时间用重要的管理信息来重画该HTML页面。

(八) JMX通知(服务器序列)

UserWeb MBeans和MBean事件听者在应用程序服务器启动时被使用相应的启动类创建并且注册

管理员设置"master"UserWeb MBean属性(警告消息和重试间隔),然后向宿主在远程管理服务器上的听者广播或通知这一状态

远程听者处理通知-通过把master(通知)数据复制到本地UserWeb MBean实现

(九) XMLHttpRequest查询(客户序列)

支持AJAX的客户端间隔地调用一个servlet以查询管理状态

该servlet读取本地UserWeb MBean属性,然后把它们插入到一个XML消息中并且返回该XML消息作为一个到浏览器客户的XML响应(以后讨论可供选择的消息格式)

然后,AJAX客户分析XML文档,提取警告和重试间隔等消息,重画屏幕,然后使用这一重试间隔来设置下一个XMLHttpRequest的延迟时间。

下面详细描述其中的每一步。

在每一个J2EE服务器实例上,在服务器启动时运行两个启动类:

ManagementStartup-它把UserWeb MBean注册到本地MBean服务器。Startup类参数包括警告状态的默认设置,还有MBean名称和MBean类。例如:

<StartupClass
Arguments="ServerName=admin,
MBeanName=ExampleApp:Name=UserWeb,
MBeanClass=com.grahamh.management.userWeb.UserWeb"
ClassName="com.grahamh.management.startup.ManagementStartup"
FailureIsFatal="true" Name="UserWEB" Notes=""
Targets="admin,OLTPCluster"/>

MbeanRegistrations-它用管理服务器上的UserWeb MBean来注册一个Singleton POJO-ManagementListener。

一个javax.management.NotificationFilterSupport对象被用于列举UserWeb MBean将生成和听者将接收的通知的类型:

//MbeanRegistrations.java
MBeanHelperFactory.getWebHelper().registerListener();
//UserWebMbeanListener.java
public void registerListener() throws UserWebException{
try {
 //得到听者和过滤
 ManagementListener listener = MBeanHelperFactory.getListener();
 NotificationFilterSupport filter = listener.getSupportedEvents();
 //得到admin mbean服务器;
 //用UserWeb MBean注册该听者和过滤
 RemoteMBeanServer rmbs = getAdminMbeanServer();
 rmbs.addNotificationListener

("ExampleApp:Name=UserWeb", listener, filter, null);
}
catch (Exception e) {
 throw new UserWebException

("Unable to registerListener: "+ e.getMessage(), e);
}
}

该listener.getSupportedEvents()方法返回下面的过滤器(filter):

NotificationFilterSupport filter = new NotificationFilterSupport();
filter.enableType("alert.broadcast");

当ManagementListener在服务器启动时,在(远程的)管理服务器上建立一个到MBean服务器的连接,而且(本地的)ManagementListener被注册为一个听者-听取在UserWeb MBean上生成的事件,并且有一个过滤器被设置为"alert.broadcast"事件类型。

因为该ManagementListener实现Weblogic.management.RemoteNotificationListener,所以它可以得到在本地JVM或一远程JVM上生成的JMX通知;在本文中,是指在远程管理服务器JVM上生成的JMX通知。

精彩图集

赞助商链接