观察如下订单流程。
订单流程
此订单流程在收到订单消息后开始,然后检查订购的商品是否可用,如果有货,则发送给客户,然后财务结算。如果某件商品不可用,则调用采购子流程进行采购。
采购子流程上有两个附加事件。通过使用附加事件,可以处理在任务或子流程执行期间可能自发发生的事件。我们必须区分中断和非中断附加事件。它们都捕获并处理发生的事件,但只有非中断类型(这里是升级事件“延迟交付”)不会中止它所附加的活动。当中断事件类型触发时,当前活动的执行立即停止。

库存维护流程
与订单流程相关的流程中有一个库存维护流程。
库存维护流程由条件启动事件触发。这意味着如果条件变为真,则实例化该过程,在此示例中,当库存水平低于某个最小值时,为了增加库存水平,必须采购物品。我们使用与订单履行相同的采购流程,并通过调用活动“采购”来引用它,用粗边框表示。与订单履行流程类似,此流程通过从目录中删除商品来处理错误异常。但是在这个库存维护过程中,不需要处理“延迟交货”升级事件。如果采购子流程正常结束,则库存水平高于最低限度,库存维护流程以结束事件“物品已采购”结束。

采购子流程
我们现在放大用于订单履行和库存维护的全局子流程“采购”。

这是一个子流程,start 事件是普通的,表明这个流程不是由任何外部事件触发的,而是由引用的顶级流程触发的。
此子流程中的第一项任务是检查供应商处是否有要采购的物品。如果没有,这个子流程将抛出“不可交付”的异常,正如我们已经讨论过的,订单履行和库存维护都会捕获该异常。
如果采购流程中的交付持续超过 2 天,则分包商会引发升级事件,流程告诉引用的顶级流程交付将延迟。与错误事件类似,升级事件也有一个升级code,这是连接抛出和捕获升级事件所必需的。
与抛出错误事件相反,当前活动线程既不会终止,也不会受到抛出中间升级事件的影响,采购流程通过等待交货继续执行。
抛出的事件由最近的父活动处理,并带有一个附加的中间升级事件,该事件与抛出的升级事件具有相同的Code。本例中,在订单履行流程中,附加到采购子流程的“延迟交付”升级事件捕获抛出的“延迟交付”事件。该事件是一个不间断的事件,因此产生了一个新的令牌,遵循升级处理的路径并触发通知客户订购的物品将稍后发货的任务。当采购子流程完成时,订单履行流程继续进行物品装运和财务结算。
参考文献:
OMG. BPMN 2.0 by Example [R], 2010.

原 文 
评 论