|
背景
在如今的企业应用中,业务越来越复杂,各个业务之间联系也越来越紧密。在这种情况下,当某个业务的应用程序出现问题,或者某些资源(例如数据库连接)不可用时,往往会导致失败事件发生。快速、准确的定位错误源,并提供适当的人工恢复是非常重要的。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" 以及更高权限的用户才能对失败事件进行操作。
- 打开 Failed Event Manager 管理控制台界面,点击左侧导航栏中的 Integration Application->Failed Event Manager,右侧就会显示 Failed Event Manager 的信息,包括根据各种条件查询的 link 以及所有失败事件的数目。如图 1:
图 1:失败事件管理器控制台界面
- 根据各种条件查询失败事件:在控制台上(AdminConsole),失败事件管理器提供了根据各种查询条件来快速查询失败事件,也提供了各种查询的组合。点击右侧 Advanced search,就可看到以基于下图 2 中的各种查询条件,查询结果是各种查询条件的交集。
图2:根据各种条件进行失败事件查询
- 失败事件管理的功能列表,在失败事件列表的上方,提供了对失败事件的提交,删除,查询等操作,可以选择一组失败事件进行批处理操作。点击 Get All, 可以获得所有的失败事件列表。 选定一组失败事件,可以通过点击 Resubmit 重新提交。 如图 3:
图 3:失败事件管理器的功能列表
- 查看单条失败事件的详细信息: 点击单条失败事件,可以查看这条失败事件的详细信息,包括 sessionID,失败的详细信息,以及失败的时间等。根据这些信息可以快速定位失败点,从而人工恢复故障,然后重新提交。如图 4:
图 4:失败事件的详细信息
- 查看失败事件的业务数据:在失败事件详细信息里,点击 Edit Business data,可以查看到失败事件的业务数据的组成以及数据内容。如图 5:
图 5:失败事件的业务数据
- 修改失败事件的业务数据后重新提交:点击 Edit busininess data,就可以查看这条失败事件相关的业务数据信息,同时也可以修改业务数据信息,然后提交从而有可能使业务正常处理。如图 6:
图 6:修改业务数据信息
- 重新提交并打开 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 连接的方式查找:
- 首先获得 AdminClient:
清单 1:获得 AdminClient
AdminClient = AdminClientFactory.createAdminClient(adminClientProps)
|
adminClientProps 的信息如下,这里 WPS runtime global security 没有打开,如果 global security 打开,应该设置额外的一些安全属性:
adminClientProps 的信息:
| key | value |
|---|
| AdminClient.CONNECTOR_TYPE | SOAP |
|---|
| AdminClient.CONNECTOR_HOST | HOST_IP |
|---|
| AdminClient.CONNECTOR_PORT | SOAP PORT(eg:8879) |
|---|
- 在得到 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")
|
- 当查询到 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 里,用户已经产生若干条失败事件,定制的失败事件程序将依次做以下事情:
- 查看所有的失败事件个数
- 查看所有失败事件个数,并打印对应的失败事件 id.
- 查询给定 BO 类型的失败事件,并打印对应的失败事件 id
- 根据失败事件发生的目的模块,目的组件以及目操作方法来查询失败事件,并打印对应的失败事件 id
- 根据失败事件发生的源模块,源组件来查找失败事件,并打应对应得失败事件 id
- 查询指定时间段的失败事件,并打印对应的失败事件 id
- 查看制定 id 的失败事件的对应的 BO 以及 BO 类型
- 重新提交所有的失败事件
- 删除所有的失败事件
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.zip | 10KB | HTTP |
|---|
|