本系列的第
3 部分将介绍如何使用 WebSphere Lombardi Edition V7.1 的高级功能来完善业务流程,从而满足更复杂的需求,这些需求中包括嵌套的流程、里程碑、事件机制、异常处理和
Lombardi Web 服务公开。
概述
本系列的 第 1 部分 概述了 WebSphere Lombardi V7.1(以下简称
Lombardi)的功能和架构。在 第 2 部分 中,学习了如何使用最常用的 Lombardi 功能(包括业务流程定义以及
Integration、Human 和 Rule 服务)来建模示例流程。
在本文中,您将学习如何使用 Lombardi 的高级功能来完善业务流程,从而满足更复杂的需求,这些需求中包括嵌套的流程、里程碑、事件机制、异常处理和
Lombardi Web 服务公开。我们将使用第 1 和 2 部分中介绍的购买订单场景演示这些功能。
完善流程功能
在本节中,我们将介绍能够完善示例流程功能的一些方法。
向流程添加里程碑
您可以向流程图添加里程碑来演示流程执行的各个阶段。为此,可以将 Milestone
元素拖入流程图中,并为该里程碑输入一个名称。例如,您可以添加一个 Order Submission 里程碑来捕获某个流程的初始订单提交阶段中发生的跨通道活动,如图
1 所示。
图 1. 某个流程中的里程碑
您也可以导入和解压 下载 部分的 Lombardi .twx 导出文件,以查看已完成的业务流程定义。
除了 Order Submission 里程碑,还为我们场景中的重要阶段定义了其他两个里程碑,如图
1 所示:
Order Validation 里程碑 - 用于验证订单,包括订单是否需要购买者重新确认,以及提供商的响应等。
Order Fulfillment 里程碑 – 用于演示最终订单生成、送货和支付活动。
创建嵌套流程
您可以使用嵌套流程来封装与某个父流程中的其他每个流程相关的活动。使用嵌套流程,可以管理业务流程的复杂性,同时保留在父流程定义中表示的总体流程的高级视图。业务流程定义
(BPD) 中的每个活动都可以有一个附加的嵌套流程,嵌套流程中的每个活动也可有一个附加的嵌套流程,等等。
当在运行时触发某个嵌套流程所实现的一个活动时,会执行附加的嵌套流程。嵌套流程运行完成后,父流程就会恢复执行。
在示例购买订单流程中,ERP 通道中的 GenerateOrder 活动是使用一个名为
Generate Order 的嵌套流程来实现的,该流程包含 3 个活动:Calculate Price、Select
Shipper 和 Schedule Shipper。该嵌套流程的实现类似于一般的 BPD 开发。
您可以将该嵌套流程链接到父流程中的 GenerateOrder 活动。为此,在
Purchase Order Process BPD 中,请单击 GenerateOrder 活动并选择属性中的
Implementation 选项卡。在 Implementation 下,从下拉菜单中选择 Lombardi
Nested Process。单击 Select 从现有业务流程定义列表中选择 BPD,然后从列表中选择
Generate Order BPD,如图 2 所示。
图 2. 使用嵌套流程实现一个活动
在 Order Validation 里程碑中,所有活动组合为一个嵌套的
Order Confirmation 流程,如图 3 所示。除了附加到 Buyer Confirms Order
活动的计时器事件(我们稍后进行讨论),其他所有活动和网关都与您在本系列前几部分中实现的相同。
图 3. 嵌套的 Order Confirmation
流程
自定义事件处理
在本节中,您将学习一些自定义示例流程中的事件处理方式。
什么是 Undercover Agent
在了解事件处理实现之前,您应该理解 Lombardi 概念 Undercover
Agent (UCA)。UCA 由一个事件启动,该事件可通过一条消息或按照特定的时间表触发。当 UCA
启动时,它会调用一个附加的服务来响应该事件。
从本系列的第 1 部分,您已知道 Event Manager 是 Process
Server 的一部分,负责处理事件调度和排队。Event Manager 需要一个 UCA 来查找它应该运行的服务。因此,如果您希望在收到一条传入消息事件时调用一个服务,或者如果您希望在一个事件定期发生后调用一个服务,那么您应该创建一个
UCA 代理。本节后面会更详细地介绍这个概念。
传入的消息可能源自您创建的一个 Web 服务,或者源自您向 JMS Listener
发布的一条消息。在示例中,我们将使用 Web 服务来从外部系统发起入站请求。
Lombardi 提供了哪些事件类型?
Lombardi 提供了一种灵活且强健的事件机制,可在一个运行时流程开始、运行或结束时启用事件。Lombardi
提供了 10 种不同的事件类型,包括我们将在示例场景中使用的以下 4 种事件:
开始事件 - 每次创建 BPD 时会自动包含一个开始事件。可以使用该事件来建模一个流程或嵌套流程的开始。每个
BPD 中只有一个开始事件。
结束事件 - 每次创建 BPD 时会自动包含一个结束事件。在嵌套流程运行完成后,父流程就会恢复执行。
中间消息事件 - 一个 BPD 可包含多于一个中间消息事件。可以使用该事件来建模在流程运行时收到的消息事件。该事件由您选择的
UCA 触发。
计时器事件 - 使用计时器事件来建模您 BPD 中的升级路径或延迟。使用计时器事件,您可以指定一个时间间隔,让某个活动在此时间间隔之后或之前执行。
创建中间消息事件
在示例场景的 Generate Order 嵌套流程中,要求购买者先支付订单费用,然后才会执行
Select Shipper 活动。这意味着,该流程需要一个中间消息事件来等待支付通知,然后才执行 Select
Shipper 活动。
让我们选择一个中间消息事件来演示 Lombardi 中的事件处理机制:
通过将一个 Intermediate Message Event 元素从面板拖入
Generate Order BPD 图中,创建一个事件并指定 Wait for Buyer's Payment
作为名称。将此消息事件连接在 Calculate Price 活动与 Select Shipper 活动之间,如图
4 所示。
图 4. 创建一个中间消息事件
创建一个名为 Payment Integration Service 的
Integration 服务,或使用在 下载 中提供的已创建的 payment.jar。
在 Designer 视图中,单击库中 Files 旁边的加号 (+),选择一个服务器文件以添加
JAR 文件。在 New File 对话框中,单击 Browse 选择 JAR 文件。
现在您可以在 Java 集成中使用这个外部 Java? 类。
将一个 Java Integration 组件从面板拖到服务图中,然后使用序列线
(sequence line) 将该组件连接到开始和结束事件。单击图中的 Java Integration
组件,然后选择属性中的 Definition 选项。单击 Java Class 字段旁边的 Select,选择
JAR 文件和 JAR 文件的类,如图 5 所示。这个 Java 类中的操作的输入数据类型为 String,输出数据类型十进制。
图 5. Java 集成
创建一个名为 Payment Service 的一般系统服务,将 Payment
Integration Service 拖入此图中,如图 6 所示。单击 Input Mapping 和
Output Mapping 部分中的自动映射图标,自动创建服务的变量,以便关联一些通用系统服务。
图 6. Payment Service
创建一个名为 Settle Payment UCA 的基于事件的 UCA,以包装新创建的
Payment Service。指定 On Event 作为计划类型,如图 7 所示。
图 7. 创建 Settle Payment
UCA
将 Undercover Agent 附加到消息事件。
选择 Generate Order BPD 中的 Wait for Buyer's
Payment 中间消息事件,单击属性中的 Implementation 选项。在 Message Trigger
部分中,单击 Attached UCA 字段旁边的 Select,以便从 Undercover Agent
列表中选择 Settle Payment UCA。
Consume Message 默认情况下已选定。如果您不希望在消息事件收到传入消息后使用它,那么请取消选择它。
如果选择了 Durable Subscription,则意味着消息事件可接受一个传入消息,甚至在消息事件未处于活动状态时便可接受传入消息。
在 UCA Output Correlation 部分中,您需要将合适的
UCA 输出变量映射到 BPD 中的一个局部变量,以便将消息事件与 BPD 实例相关联。以下是用作 UCA
输出关联的订单 ID,如图 8 所示。
图 8. 将 UCA 附加到中间消息事件
创建计时器事件
有两种类型的计时器事件:一个是附加的计时器事件,它直接附加到 BPD 中的某个活动,另一个是一个中间件计时器事件,它使用序列线连接到其他流程状态。如果将某个计时器事件为附加到某个活动,则会导致延迟。在继续到下一个活动之前,流程会等待计时器触发。您可以使用计时器事件指定一个时间间隔,让某个活动会在该时间间隔之前或之后执行,或者在该时间间隔之前或之后进入您流程中的另一个路径。
让我们看看如何在示例场景中使用计时器事件机制。在嵌套 Order Confirmation
流程中,如果提供商更改商品的数量或价格,Rule 服务会依据业务规则验证订单更改。此时,购买者可能需要重新确认订单。在此情况下,如果购买者在
1 周(7 天)内没有确认该订单,这意味着购买者已默认接受此订单。
图 9 显示了一个示例附加计时器事件。在示例中,计时器确保如果流程到达
Buyer Confirms Order 活动特定时间量(在本例中为 1 分钟),则会传递该活动,该流程将前进到下一步(结束事件)。
图 9. 附加计时器事件示例
添加异常处理
当您开发的流程需要集成外部系统、服务器脚本和其他复杂实现时,您需要预测潜在异常,创建在发生这些异常时处理它们所需的组件。
有两种针对 BPD 的异常事件:中间异常事件,它用于捕获流程执行异常,并使用错误处理器活动或更多流程流来处理异常,还有最终异常事件,它用于向父流程抛出一个异常。
在示例购买订单场景中,Shipper Selection 由系统自动完成,它公开为一个
Web 服务。在 Generate Order 嵌套流程中,如果在调用此服务时抛出了一个异常,则假设系统需要通知提供商。
要满足此需求,请将 Intermediate Exception Event
元素从面板拖入 Select Shipper 活动,然后向流程添加一个名为 Send Exception
to Supplier 的新活动。随后请将 Intermediate Exception Event 组件连接到该新活动,如图
10 所示。
图 10. 添加中间异常事件
Select Shipper 活动的异常处理到此就结束了。当 Select
Shipper 活动中出现错误时,该流程会自动转到 Send Exception to Supplier
活动。
公开 Lombardi Web 服务
Web 服务定义将一个 Lombardi 服务(或一组 Lombardi
服务)公开为可进行 SOAP 调用的 Web 服务。这允许企业应用程序访问在 Lombardi 中开发的业务流程管理应用程序。您可以创建和发布
Web 服务,使外部应用程序能够发起一个特定的 Lombardi 服务或一组服务。
在示例场景中,我们将创建一个 Web 服务,使用合适的输入调用 Settle
Payment UCA 来发送事件(调用方服务)。为此,请执行以下步骤:
创建一个名为 Call Payment UCA Service 的一般系统服务。
将一个 Invoke UCA 元素拖入图中,指定 Kickoff Settle
Payment UCA 作为名称。在 Implementation 选项卡上,请选择 Settle Payment
UCA 作为附加 UCA,如图 11 所示。
图 11. Call Payment UCA
Service
接下来,您需要将 Call Payment UCA Service 公开为一个
Web 服务供外部调用。在 Designer 视图中,选择 Implementation 类别旁边的加号
(+),然后从列表中选择 Web Service 来创建一个名为 PaymentWS 的 Web 服务。
在 Operations 部分中,单击 Add 以选择一个要添加的现有服务(Call
Payment UCA Service)。指定 callPaymentUCA 作为操作名称,如图 12
所示。
要查看结果 Web 服务的 XML 描述及它的元素和操作,请单击 Behavior
部分中的 WSDL URI。
图 12. 创建一个 Web 服务
结束语
在本系列的第 3 部分中,您学习了如何使用 WebSphere Lombardi
Edition V7.1 的一些高级功能来完善示例流程,从而满足更复杂的需求,这些需求中包括添加嵌套流程、里程碑、事件机制、异常处理和公开
Lombardi Web 服务。在本系列未来的文章中,您将学习如何使用 coach 构建 Human 服务。
|