事件子流程是一个被事件触发的子流程。事件子流程可以加在流程层级(与流程实例平级),也可以增加在子流程层级(与子流程内的实例平级)。事件子流程的触发是一个被配置的开始事件。因此,空开始事件不被事件子流程支持。事件子流程可以被message events, error events, signal events, timer events, or compensation events触发。当作用域(流程实例或者子流程)持有的事件子流程被创建时,开始事件的订阅被创建。当这个作用域结束时,订阅被删除。
事件子流程可以是可中断的,也可以是不可中断的。可中断子流程会取消掉当前作用域内的任何执行。不可中断事件子流程会创建一个新的并行执行。可中断事件子流程只能被触发一次,对于作用域内持有它的活动。不可中断事件子流程可以被触发多次。无论子进程是中断的还是非中断的,都是使用触发事件子进程的启动事件来配置的。
事件子流程可能没有incoming和outgoing流程序列。因为事件子流程是由事件触发的,所有incoming流程序列是没有意义的。当一个事件子流程结束了时,要么是当前作用域被结束了(可中断事件子流程),要么是当前执行产生的不可中断子流程被结束了。
事件子流程看着像一个被虚线轮廓包围起来的嵌入式子流程。
它的xml表示与嵌入式子流程是一样的,只是triggeredByEvent属性的值必须是true:
<subProcess id="eventSubProcess" triggeredByEvent="true">
<!-- ... -->
</subProcess>
例子(Example):
下面的例子是一个被错误开始事件(Error Start Event)触发的事件子流程。这个事件子流程是流程级的,也就是说它的作用域时流程实例:
上面的事件子流程的xml表示:
<subProcess id="eventSubProcess" triggeredByEvent="true">
<startEvent id="catchError">
<errorEventDefinition errorRef="error" />
</startEvent>
<sequenceFlow id="flow2" sourceRef="catchError" targetRef="taskAfterErrorCatch" />
<userTask id="taskAfterErrorCatch" name="Provide additional data" />
</subProcess>
正如前面所说,事件子流程也可以添加到嵌入子流程中。如果它被添加到嵌入式子流程中,它就成为了边界事件的替代者。看下面两个流程图。两个嵌入式子流程都会抛出一个错误事件。这个错误事件都会被捕获并且被处理。
而不是:
两种情况下,相同的task会被执行。但是,他们有一些不同:
1.嵌入式子流程是使用相同的执行器,当执行相同作用域内的执行时。这就意味着嵌入式子流程可以访问当前作用域内的本地变量。当使用便捷事件时,当流程离开边界事件时,边界事件的嵌入式子流程执行器就会被删除。也就是说,被嵌入式子流程创建的流程变量就不可访问了。
2.当使用事件子流程时,事件完全有子流程处理。当使用边界事件时,事件由它的父流程处理。
这两个不同可以帮助你决定是使用边界事件还是嵌入式子流程更适合你解决特殊问题进行建模。这两个不同可以帮助你决定是使用边界事件还是嵌入式子流程更适合你解决特殊问题进行建模。