This topic applies only to the IBM Business Process Manager Advanced configuration.

按顺序处理事件

当需要确保事件按顺序处理并且在处理下一个事件之前完整处理当前事件时,可以使用事件排序限定符。

关于此任务

有时,您需要确保数据按顺序处理。例如,要确保在处理员工记录的任何更新事件之前创建该员工记录。 客户机确定事件发送至组件的顺序,但控制客户机向队列提供事件的顺序是不够的。将添加新员工记录的事件可能处理较缓慢,而更新事件可能执行较快速。您可以为此类事件建立限定符以确保按接收顺序对其进行处理。

服务收到事件时,这些事件将加入队列。安排以接收顺序处理这些事件,但运行时环境是多线程环境。多个进程为该队列提供服务,每个进程可以不同的速度运行,因此可以不同于交付至队列的顺序处理这些事件。在事件出队列的时间与对服务调用对应操作的时间之间存在延迟。在该期限内,下一个事件可能会出队列并且可能调用其对应的操作。处理延迟可能会导致在第一个事件之前处理第二个事件。如果处理顺序很重要,您可以通过事件排序限定符来提供一种方法对其进行控制。

本主题将介绍如何将操作分配给组以及如何为与每个操作关联的事件定义键。该限定符将确保以接收顺序处理与同一个组中具有相同键值的操作关联的事件。对于员工记录,键可以是员工标识或是位置和标识的组合。事件排序可以保证从事件队列获取该标识的 create_record 事件时,将其传递至服务并进行完整处理,然后才允许运行该标识的 update_record 事件。
注: 通过使用不相关功能,您可以在创建绑定时向 EIS、MQ 或 MQ JMS 绑定添加排序属性。该属性表示组件必须遵循从导出接收事件的顺序。有关该属性的更多信息,请参阅“导入和导出 EIS 服务”和“消息传递”。

一旦您决定需要对组件使用事件排序限定符,就需要计划您希望如何使用这些限定符。首先,请查看组件接口上的操作。标识要包含在顺序中的操作。由于组件处理各种对象,因此您可能会发现需要两个或更多个顺序。例如,常规酒店组件可能具有一组用于预订酒店房间的操作,和另一组用于预订会议大厅的操作。

标识哪些操作将参与顺序。例如,将 reserve_hotel_room 和 clean_hotel_room 放入一组,将 book_convention_hall 和 set_up_convention_hall 放入另一组,并假设酒店房间的相关操作与会议大厅的相关操作完全独立。

标识要处理的对象。第一组操作的键是房间编号,例如 201(2 楼 01 号房间)。第二组操作的键可能是房间名称,例如“主会议室”和“西放映室”。标识这些属性之后,您就需要对指定该键的所有操作添加事件排序限定符。下面的指示信息解释如何执行这些任务。

事件排序限定符会在将事件发送至目标组件之前获取一个锁。业务逻辑执行完成后,释放该锁。 由于一个任务必须完成,下一个任务才能开始,因此您需要注意应用该功能的位置。确保不会使必要进程停顿不可接受的时间,因为您已对事件可能需要长时间完成的一些情况应用排序。

要对与操作相关的事件建立顺序,请执行以下步骤:

过程

  1. 在模块组合件图中,选择要限定的组件。 该组件必须具有 WSDL 接口;不能在具有 Java™ 接口的组件上设置事件排序限定符。
  2. 在“属性”视图中,单击详细信息选项卡,该选项卡显示组件的接口和引用。 如果尝试控制与更新员工记录相关的顺序,可选择用于控制这些更新的组件并根据员工标识(可能是名称或编号)建立顺序。
  3. 展开树并选择组件的 WSDL 接口的操作。
  4. 单击限定符,单击添加,然后从所提供的列表中选择事件排序 事件排序限定符将添加到该操作。 在您选择该限定符时,可以在下级视图中看到其属性。
  5. 为该操作所属的组创建或选择名称。 同一个组中所有操作的事件被认为是一起进行排序。它们的顺序不同于其他组中操作的事件的顺序。保证按到达顺序传递同一个组中具有相同键值的事件。
  6. 在“限定符事件排序的属性”视图中,单击参数名称的表单元格,然后从所提供的列表中选择相关参数。 这些参数是业务对象或简单类型。
  7. 提供 XPath 表达式以标识将在键中使用的简单类型。您可以在所提供的字段中输入 XPath 表达式,也可以选择表单元格,然后单击省略符 (...) 按钮以打开“XPath 表达式构建器”向导,该向导将帮助您完成此过程。仅选择业务对象属性,该向导将为您构造 XPath 表达式。 表中的每行构成该键。每个 XPath 表达式应求值为简单类型。键值由您在表中定义的一个或多个字段组成。 以组件接收事件的顺序处理同一个组中具有相同键值(例如,员工编号 1234 或房间编号 201)的事件。
  8. 如果要添加更多参数,请单击添加并重复步骤 5 和 6。 如果键中存在两个或更多个属性,那么其顺序很重要。例如,假设在酒店示例中,将房间编号表示为两个字段,楼层编号和该楼层的房间编号。您已创建一个顺序,允许您在整理房间时锁定事件队列中该房间。这样,您需要确保为 renovate_room 定义的限定符和为 reserve_room 定义的限定符所具有房间和楼层字段顺序与键定义表中相同。否则,酒店人员将无法预订 08 楼的 03 号房间,直至对 03 楼的 08 号房间完成整理。如果颠倒表中的参数,那么 renovate_room 将获取键值 0803(3 楼的 8 号房间)的锁,但 reserve_room 会将该锁解释为应用于 08 楼的 03 号房间。在本示例中,键表中的楼层编号字段必须始终在房间编号之前。您可以使用视图中的方向按钮更改键中所选字段的位置。
  9. 处理错误或不可用资源都可能导致已排序事件失败。顺序中任何剩余事件的处理方式由事件排序限定符的遇到错误时处理请求复选框确定。要控制已排序事件失败时对依赖事件的处理,请完成以下某个步骤:
    • 如果要继续处理事件顺序而不管任何事件是否失败,请确保选中遇到错误时处理请求复选框。
    • 如果要暂挂处理依赖事件,直至解决失败的已排序事件,请清除遇到错误时处理请求复选框。
    注: 您可以使用 Failed Event Manager 快速识别失败的已排序事件并重新提交以进行处理。
  10. 保存您在组合件编辑器中的更改。 您可以随时更改参数名称或 XPath 表达式。