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

80酷酷网    80kuku.com

  ajax文章提示 AJAX和JMX分别位于系统管理栈的两个对立端。然而,如今AJAX模型已普遍存在于丰富的浏览器客户端。这使得该模型在构架领域为在问题解析管道中提高支持模式所具有的优点变得模糊起来。

  本文将详细描述一种AJAX架构的优点-它可以把管理状态"广播"到一个能够使用浏览器的用户基上而不必等待页面更新。

  这种架构是一个通用模型的扩展-可用于把JMX事件和属性记载到一个服务器端日志文件中;而且,这种变化进一步把管理信息记录或"广播"到(支持AJAX的)用户基。

  在本文中,我们将特别分析AJAX请求/响应模型和把管理数据绘制到页面的过程,还有漂亮的JMX通知框架-所有这些都通过一个装配的servlet清晰地集成到一起。

  接下来我们还会粗略地看一下通常在标准AJAX讨论中所不及的内容-安全和容量模型。

  本文中,我们使用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 MBean
MBean服务器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的延迟时间。

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

[1]    



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: