首页 文章 Java基础 WPS V6.1 失败事件管理器实践

邮件订阅

WPS V6.1 失败事件管理器实践 E-mail
用户评价: / 0
好 
作者:Administrator   
2009-01-14 23:07

背景

在如今的企业应用中,业务越来越复杂,各个业务之间联系也越来越紧密。在这种情况下,当某个业务的应用程序出现问题,或者某些资源(例如数据库连接)不可用时,往往会导致失败事件发生。快速、准确的定位错误源,并提供适当的人工恢复是非常重要的。WebSphere Process Server(以下称为 WPS) 运行环境提供了失败事件恢复机制。通过系统总线传递的消息的应用之间,一旦出现异常或错误,消息便会被存储到数据库中。因为在 SCA 服务的四种调用方式中,同步调用不会通过系统总线来传递消息,所以失败事件恢复只支持对异步事件传输过程中异常的处理。此外,在 WPS V61 运行环境中除了 SCA 系统总线外,还有 SCA 应用总线和 BPC 总线。目前失败事件恢复只支持 SCA 系统总线内错误消息的处理。本文将为您讲述针对 SCA 系统总线失败事件的管理和定制。可能引起事件处理出错的原因包括(但不限于):

  • 未找到指定的消息目的队列导致消息无法正确传递
  • 消息从队列中取出进行处理时,在事务提交之前出现未预期的错误

以上错误原因会导致在 SCA 的异步调用过程中抛出系统异常,从而产生失败事件,WPS 失败事件管理机制会存储消息及上下文环境。 用户可以在 WPS V61 的管理控制台中浏览、删除或重新提交失败事件。用户可以查看失败事件的以下属性:

  • 消息的唯一标识
  • 目标模块名称
  • 目标组件名称
  • 调用目标的方法名称
  • 源模块名称
  • 源组件名称
  • 重新提交的目标队列名称
  • 事件交互方式
  • 错误信息
  • Session标识
  • 出错时间

还可以进一步查看事件内部业务对象中的数据,进行修改后重新提交这些数据。除了对出错事件进行存储和管理外,用户还可以通过设置系统日志跟踪级别,将保存、删除和重新提交事件的动作本身写入 Common Event Infrastructure(CEI),以便于系统监控和管理。本篇文章介绍了 WPS V61 失败事件管理的使用,WPS 运行环境在控制台提供了失败事件管理功能,同时为了方便用户订制自己的失败事件管理程序,WPS 运行环境也提供了 API。本文从控制台和 API 两个方面进行介绍。

基于控制台 AdminConsole (Failed Event Manager) 的失败事件管理

WPS Runtime 的控制台提供了对失败事件管理的界面,通过控制台,用户可以查询,删除,重新提交失败事件,也可以在修改业务数据以后重新提交失败事件。本节中我们将向您介绍如何基于控制台对失败事件进行管理。使用失败事件管理器的前提是已经在 WPS 配置了 SCA,并且是具有 "Operator" 以及更高权限的用户才能对失败事件进行操作。

  1. 打开 Failed Event Manager 管理控制台界面,点击左侧导航栏中的 Integration Application->Failed Event Manager,右侧就会显示 Failed Event Manager 的信息,包括根据各种条件查询的 link 以及所有失败事件的数目。如图 1:

    图 1:失败事件管理器控制台界面


  1. 根据各种条件查询失败事件:在控制台上(AdminConsole),失败事件管理器提供了根据各种查询条件来快速查询失败事件,也提供了各种查询的组合。点击右侧 Advanced search,就可看到以基于下图 2 中的各种查询条件,查询结果是各种查询条件的交集。

    图2:根据各种条件进行失败事件查询


  1. 失败事件管理的功能列表,在失败事件列表的上方,提供了对失败事件的提交,删除,查询等操作,可以选择一组失败事件进行批处理操作。点击 Get All, 可以获得所有的失败事件列表。 选定一组失败事件,可以通过点击 Resubmit 重新提交。 如图 3:

    图 3:失败事件管理器的功能列表


  1. 查看单条失败事件的详细信息: 点击单条失败事件,可以查看这条失败事件的详细信息,包括 sessionID,失败的详细信息,以及失败的时间等。根据这些信息可以快速定位失败点,从而人工恢复故障,然后重新提交。如图 4:

    图 4:失败事件的详细信息


  1. 查看失败事件的业务数据:在失败事件详细信息里,点击 Edit Business data,可以查看到失败事件的业务数据的组成以及数据内容。如图 5:

    图 5:失败事件的业务数据


  1. 修改失败事件的业务数据后重新提交:点击 Edit busininess data,就可以查看这条失败事件相关的业务数据信息,同时也可以修改业务数据信息,然后提交从而有可能使业务正常处理。如图 6:

    图 6:修改业务数据信息


  1. 重新提交并打开 CEI Trace:从失败事件列表中,选择一个失败事件,然后点击 Resubmit with trace,当修改完 'Trace control'后, 点击 ok,这样一条失败事件就被重新提交,同时会产生 CEI Event 从而方便 WPS 监控。如图 7:

    图 7:在重新提交之前打开 CEI trace






回页首


利用 API 来定制失败事件管理程序

在很多情况下,用户要根据自己的需求来定制失败事件处理程序,比如要经常查看与某一个 Component 有关的失败事件。WPS runtime 以 JMX MBean 的方式向外界提供了访问方式。JMX 提供了一个应用程序或是资源管理的标准架构,从而可以让外部用户通过 MBean 来访问一些资源。MBean 是符合 JMX 规范的 JavaBean. MBean 注册在相应的 Server 上,当需要用 MBean 来访问资源或者资源管理的时候,需要查找到这个 MBean,然后再通过 JMX 的 API 来调用相应的操作。WPS 运行环境提供了 FaileEventManger MBean,下边介绍直接用 FailedEventManager MBean 来进行失败事件的管理,我们在这里讲述用单独的 j2se 程序如何管理失败事件,客户也可以让定制的程序运行在 WPS 运行环境里,这里不作详细介绍。另外也可以通过 wsadmin 来查找 FailedEventManger MBean 来实现对失败事件的管理,这里也不做详细介绍。


WPS Runtime 提供的失败事件的基本接口如下表所示:
接口名描述
FailedEvent一个失败事件的基本信息
FailedEventWithParameter一个失败事件的详细信息
FailedEventParameter与失败事件关联的业务数据的信息

要获得失败事件的操作,必须得到 FailedEventManager 的 MBean。 所以,第一步先要查询到 FailedEventManager MBean。 FailedEventManager MBean 的查找方法如下,这里我们用 SOAP 连接的方式查找:

  1. 首先获得 AdminClient:

    清单 1:获得 AdminClient
                AdminClient = AdminClientFactory.createAdminClient(adminClientProps)
              

adminClientProps 的信息如下,这里 WPS runtime global security 没有打开,如果 global security 打开,应该设置额外的一些安全属性:


adminClientProps 的信息:
keyvalue
AdminClient.CONNECTOR_TYPESOAP
AdminClient.CONNECTOR_HOSTHOST_IP
AdminClient.CONNECTOR_PORTSOAP PORT(eg:8879)

  1. 在得到 AdminClient 以后,就可以查询 FailedEventManger Mbean,FailedEventManager MBean 是注册在每个配置了 SCA 的 server 上,当 Network Deployment 环境下通过 Deployment Manager 的端口查找的时候,会查询到一组 FailedEventManager MBean,使用其中的任何一个操作即可。

    清单 2:查询 FailedEventManger Mbean
                ObjectName queryName = new ObjectName("WebSphere:*,
                type=FailedEventManager");
                ObjectName nodeAgent = null;
                Set s = adminClient.queryNames(queryName, null);
                if (!s.isEmpty())
                nodeAgent = (ObjectName) s.iterator().next();
                //Select the first  FailedEventManager MBean object here
                else
                System.out.println("Failed Event Manager MBean was not found")
              

  1. 当查询到 FailedEventManager MBean, 就可以用这个 MBean 所提供的操作来进行失败事件的查询,重新提交以及删除等操作, 同样只有在 adminClientProps 的安全信息中,必须设置具有 ‘Operator’ role 的用户信息,才能对失败事件操作。下边列出几个操作使用方法,其他操作的使用类似,不一一讲述。在文章的后边将附上一个比较完整的用户场景,方便读者参考。
    • getFailedEventCount: 查看失败事件的个数

      清单 3:查看失败事件的个数
                      String opName = "getFailedEventCount";
                      Long failedEventCount = (Long) adminClient.invoke(nodeAgent, 
                      opName, null, null);
                    

    • geAllFailedEvents:获得所有的失败事件列表

      清单 4:获得所有的失败事件列表
                     String opName = "getAllFailedEvents";
                     //pagesize of 0 means all failed events will be returned.
                     Object[] params = new Object[] {new Integer(0)};
                     String[] signature = new String[] {"int"};
                     List failedEventList = (List) adminClient.invoke(nodeAgent, 
                     opName, params,signature);
                     //Obtain failed event information in the list.
                     Iterator it = failedEventList.iterator();
                     while(it.hasNext()) {
                     FailedEvent failedEvent = (FailedEvent) it.next();
                     String msgId = failedEvent.getMsgId();
                     System.out.println(msgId);
                     }
                   

    • getFailedEventsForDestination:根据目的组件的名字,模块的名字,以及模块中的方法名字进行查询。

      清单 5:.查询失败事件
                     String opName = "getFailedEventsForDestination";
                     Object[] params = new Object[] {"Destination_module_name", 
                     "Destination_component_name", "Destination_method_name", 
                     new Integer(0)};
                     String[] signature = new String[] {"java.lang.String", 
                     "java.lang.String", "java.lang.String", "int"};
                     List failedEventList = (List) adminClient.invoke(nodeAgent, 
                     opName, params, 		signature);
                     Iterator it = failedEventList.iterator();
                     while(it.hasNext()) {
                     FailedEvent failedEvent = (FailedEvent) it.next();
                     String msgId = failedEvent.getMsgId();
                     System.out.println(msgId);
                     }
                   

在附件的 scenario 里,用户已经产生若干条失败事件,定制的失败事件程序将依次做以下事情:

  1. 查看所有的失败事件个数
  2. 查看所有失败事件个数,并打印对应的失败事件 id.
  3. 查询给定 BO 类型的失败事件,并打印对应的失败事件 id
  4. 根据失败事件发生的目的模块,目的组件以及目操作方法来查询失败事件,并打印对应的失败事件 id
  5. 根据失败事件发生的源模块,源组件来查找失败事件,并打应对应得失败事件 id
  6. 查询指定时间段的失败事件,并打印对应的失败事件 id
  7. 查看制定 id 的失败事件的对应的 BO 以及 BO 类型
  8. 重新提交所有的失败事件
  9. 删除所有的失败事件

FaileEventMangerMBean 提供的操作见下表:
操作描述
long getFailedEventCount()获得所有的失败事件个数
List getAllFailedEvents(int pagesize)获得所有失败事件列表
List getFailedEventsForDestination( String destnameModule, String destnameComponent, String destnameMethod, int pagesize)根据目的模块,目的组件以及目的操作方法来查询失败事件
List getFailedEventsForSource(String sourceModuleName, String sourceComponentName, int pagesize)根据源模块,源组件名称查找
List getFailedEventsForTimePeriod(java.util.Date begin, java.util.Date end, int pagesize)根据失败时间来查询
long String[] getFailedEventBOTypeNames(int pagesize)()获得失败事件的业务数据名称
List getFailedEventsByType(String BusinessObjectType, int pagesize)根据业务数据的类型进行查询
List getFailedEventsByException(String exceptionStr, int pagesize)根据失败信息进行查询
long getFailedEventCountBySessionId(String sessionId) 获得相同 sessionID 的失败事件的个数
List getFailedEventsBySessionId(String sessionId, int pagesize)根据 SessionID 进行查询
FailedEventWithParameters getFailedEventWithParameters( String msgId)获得特定失败事件的详细信息
void resubmitFailedEvents(List failedEvents)对一组失败事件进行重新提交
void resubmitFailedEvents(String [] msgIds)对一组失败事件进行简单重新提交
void discardFailedEvents(String [] msgIds)删除一组失败事件
void discardAll()删除所有失败事件


FailedEvent/FailedEventWithParameter/ FailedEventParameter 提供的接口如下表:
类名方法名
FailedEvent
  • getFailureDateTime()
  • getDestinationModuleName()
  • getDestinationComponentName()
  • getDestinationMethodName()
  • getSourceModuleName()
  • getSourceModuleName()
  • getSessionId()
  • getCorrelationId()
  • getDeploymentTarget()
  • getFailureMessage()
  • getMsgId()
FailedEventWithParameter
  • getFailedEventParameters()
  • setFailedEventParameters (List failedEventParameters)
  • getFailedEventParameters(Properties adminClientProperties)
  • getCEITraceControl()
  • setCEITraceControl(String ceiTraceControl)
  • getExpirationTime();
  • setExpirationTime(Date expirationTime)
FailedEventParameter
  • getValue()
  • getType ()
  • getPositon()
  • getName()
  • setValue()

当获得一组失败事件后,就可以从失败事件中获取失败事件的信息,比如与失败事件关联的业务数据的信息,并且可以修改业务数据信息。用户可以根据自己的业务需要,来定制自己的错误事件管理程序,基本的模式与附件的示意代码相同,用户可以根据自己的需求增加逻辑。值得注意的是,当用户的程序不在 WPS runtime 环境中运行,而是一个独立的 j2se 程序时,在获取失败事件的业务数据信息(BO),需要使用 getFailedEventParameters(Properties adminClientProperties) 这个 API,从而可以在本地获得对应 BO 的 schema。






回页首


总结

本文介绍了如何使用 WPS runtime 提供的失败事件管理器,分别介绍了基于控制台的失败事件管理和基于 API 来定制自己的失败事件管理程序。






回页首


下载

描述名字大小下载方法
本文用到的示例代码sample.zip10KBHTTP
关于下载方法的信息


最后更新于: 2009-01-14 23:07
 

欢迎转载

本站文章欢迎转载,但请注明出处(http://www.javajia.com,Java家)

其他相关文章