Error Event Definitions(错误事件定义)
错误事件是一种被定义的错误触发的事件。
重要说明:BPMN的错误不等同于一个Java异常。事实上,这两个没有什么不同的。BPMN错误事件是商业异常的一种表现模式。Java的异常有其自己的处理方式。
一个错误事件定义需要引用一个错误元素。如下就是一个错误事件定义引用了一个错误定义。
<endEvent id="myErrorEndEvent"> <errorEventDefinition errorRef="myError" /> </endEvent>
一个错误事件处理引用一个相同的错误元素去说明捕获了错误。
Signal Event Definitions(信号事件定义)
信号事件是一个命名的信号事件引用。一个信号事件是全局范围的(具有广告语义)并且他可以被传递到所有的活动处理程序中。
一个信号事件定义由signalEventDefinition声明的。signalRef属性引用了一个信号元素声明,他是一个根元素下的子元素定义。如下就是一个信号事件被中间事件抛出和捕获的流程片段。
<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>
signalEventDefinitions引用了同样的信号元素
Throwing a Signal Event(抛出一个信号事件)
一个信号可以通过使用bpmn的构造或者java api来在流程实例中将其抛出。如下在org.activiti.engine.RuntimeService 方法可以用来抛出一个信号声明。
RuntimeService.signalEventReceived(String signalName); RuntimeService.signalEventReceived(String signalName, String executionId);
signalEventReceived(String signalName)和signalEventReceived(String signalName,String excutionId)的区别在于,第一个方法抛出全局的信号给所有的已经订阅的程序(管理者)(广播语义)第二个方法只把信号传递给指定的执行者。
Catching a Signal Event(捕获一个信号事件)
一个信号事件可以在一个中间捕获信号事件或者一个信号边界事件中被捕获。
Querying for Signal Event subscriptions(查询信号事件订阅服务)
查询所有订阅了特殊信号事件的执行是可能的。
List<Execution> executions = runtimeService.createExecutionQuery() .signalEventSubscriptionName("alert") .list();
其实就是找到有哪些流程中的元素调用了alert这个信号事件
我们接下来就可以使用signalEventReceived(String signalName,String executionId)方法想特定的执行发送信号了(executions里面包含了所有的execution集合)