Flowable入门系列文章26 - Activity解读 02

Posted 分享牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章26 - Activity解读 02相关的知识,希望对你有一定的参考价值。

1、错误事件定义

重要说明: BPMN错误与Java异常不一样。其实两者没有什么共同之处。BPMN错误事件是建模业务异常的一种方法。Java异常是以自己特
定的方式处理的。

<endEvent id="myErrorEndEvent">
	<errorEventDefinition errorRef="myError" />
</endEvent>

2、信号事件定义

信号事件是引用命名信号的事件。信号是全局作用域(广播语义)事件,并传递给所有活动处理程序(等待进程实例/捕获信号事件)。

信号事件定义是使用signalEventDefinition元素声明的。该属性signalRef引用signal声明为definitions根元素的子元素的元素。以下是信号事件被中间事件抛出并被捕获的过程的摘录。

<definitions...>
    <!--declaration of the signal-->
    <signal id="alertSignal"name="alert"/>
    <process id="catchSignal">
        <intermediateThrowEvent id="throwSignalEvent"name="Alert">
            <!--signal event definition-->
            <signalEventDefinition signalRef="alertSignal"/>
        </intermediateThrowEvent>
        ...
        <intermediateCatchEvent id="catchSignalEvent"name="On Alert">
            <!--signal event definition-->
            <signalEventDefinition signalRef="alertSignal"/>
        </intermediateCatchEvent>
        ...
    </process>
</definitions>

所述signalEventDefinition参考中相同的signal元件。

投掷信号事件

信号可以由使用BPMN构造的流程实例抛出,也可以使用Java API以编程方式抛出。下面的方法org.flowable.engine.RuntimeService可以用来以编程方式抛出一个信号:

RuntimeService.signalEventReceived(String signalName);
RuntimeService.signalEventReceived(String signalName, String executionId);

与之间的区别在于signalEventReceived(String signalName),signalEventReceived(String signalName, String executionId)第一种方法将信号全局抛给所有订阅的处理程序(广播语义),而第二种方法仅将信号递送给特定的执行。

捕捉信号事件

信号事件可以被中间捕获信号事件或信号边界事件捕获。

查询信号事件订阅

可以查询订阅特定信号事件的所有执行:

List<Execution> executions = runtimeService.createExecutionQuery()
.signalEventSubscriptionName("alert")
.list();

然后,我们可以使用该signalEventReceived(String signalName, String executionId)方法将信号传递给这些执行。

信号事件范围

默认情况下,信号是广播进程引擎。这意味着您可以在流程实例中引发信号事件,而具有不同流程定义的其他流程实例可以在发生此事件时作出反应。

但是,有时候只需要在同一个流程实例中对信号事件作出反应。例如,一个用例就是流程实例中的一个同步机制,当两个或多个活动相互排斥时。要限制信号事件的范围,请将(非BPMN 2.0标准!)范围属性添加到信号事件定义中:

 <signal id="alertSignal" name="alert" flowable:scope="processInstance"/>

这个属性的默认值是“global”。

信号事件示例(s)

以下是使用信号进行通信的两个独立进程的示例。如果保险单更新或更改,则第一个过程开始。在一个人类参与者对这些变化进行审查之后,一个信号事件被抛出,表明一个政策已经改变:

这个事件现在可以被感兴趣的所有流程实例捕获。以下是订阅该事件的过程示例。

注意:重要的是要明白,一个信号事件广播给所有活动的处理程序。这意味着,在上面给出的例子的情况下,捕捉信号的过程的所有实例将接收事件。在这种情况下,这就是我们想要的。但是,也存在无意广播行为的情况。考虑以下过程:

上述流程中描述的模式不受BPMN支持。其思想是执行“做某事”任务时抛出的错误被边界错误事件捕获,并使用信号抛出事件传播到并行执行路径,然后中断“并行执行”任务。到目前为止,Flowable将按预期执行。信号将传播到捕获边界事件并中断任务。**但是,由于信号的广播语义,它也会被传播到订阅了信号事件的所有其他流程实例。**在这种情况下,这可能不是我们想要的。

注意:信号事件不会对特定的流程实例执行任何类型的关联。相反,它被广播给所有的流程实例。如果只需要将信号传递给特定的流程实例,请手动执行关联,并使用 signalEventReceived(String signalName, String executionId)适当的查询机制。

Flowable确实有办法通过将scope属性添加到设置为processInstance的信号事件来解决此问题。

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

以上是关于Flowable入门系列文章26 - Activity解读 02的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章18 - 部署Flowable

Flowable入门系列文章20 - 基本的Flowable概念一

Flowable入门系列文章80 - Flowable Designer部署功能

Flowable入门系列文章11 - Flowable API 01

Flowable入门系列文章1-Flowable是什么

Flowable入门系列文章74 - 历史 02