Activiti 事件

185 阅读2分钟

这是我参与更文挑战的第16天,活动详情查看: 更文挑战

消息开始事件

描述

甲消息开始事件可用于使用已命名的信息来启动一个过程实例。这有效地允许我们使用消息名称从一组替代启动事件中选择正确的启动事件。

当部署一个或多个消息开始的事件过程定义,应注意以下事项:

消息启动事件的名称在给定的流程定义中必须是唯一的。流程定义不能有多个同名的消息启动事件。Activiti 在部署流程定义时抛出异常,如果两个或多个消息启动事件引用具有相同消息名称的消息,则两个或多个消息启动事件引用相同的消息。

消息启动事件的名称在所有部署的流程定义中必须是唯一的。Activiti 在部署流程定义时抛出异常,使得一个或多个消息启动事件引用与已由不同流程定义部署的消息启动事件同名的消息。

流程版本控制:在部署流程定义的新版本时,取消先前版本的消息订阅。对于新版本中不存在的消息事件也是如此。

当启动一个流程实例,可以使用在下面的方法来触发的消息开始的事件RuntimeService:

ProcessInstance startProcessInstanceByMessage(String messageName);
ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object< processVariables);

的messageName是在给定的名字name的属性message由引用元素messageRef的属性messageEventDefinition。启动流程实例时,以下注意事项适用:

消息启动事件仅在顶级进程上受支持。嵌入式子进程不支持消息启动事件。

如果流程定义有多个消息启动事件,则runtimeService.startProcessInstanceByMessage(…​)允许选择适当的启动事件。

如果流程定义有多个消息启动事件和一个非启动事件,runtimeService.startProcessInstanceByKey(…​)并且runtimeService.startProcessInstanceById(…​)使用非启动事件启动流程实例。

如果一个流程定义有多个消息开始的事件,并没有没有启动事件,runtimeService.startProcessInstanceByKey(…​)并runtimeService.startProcessInstanceById(…​)抛出一个异常。

如果一个进程的定义有一个消息开始的事件,runtimeService.startProcessInstanceByKey(…​)并runtimeService.startProcessInstanceById(…​)使用消息开始的事件开始一个新的流程实例。

如果流程是从呼叫活动启动的,则仅在以下情况下才支持消息启动事件

除了消息开始事件之外,流程还有一个无开始事件

该流程只有一个消息启动事件,没有其他启动事件。

图形符号

消息开始事件显示为带有消息事件符号的圆圈。该符号未填充,以可视化捕捉(接收)行为。

image.png

XML 表示

消息开始事件的 XML 表示是带有 messageEventDefinition 子元素的正常开始事件声明:

<definitions id="definitions"
  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:activiti="http://activiti.org/bpmn"
  targetNamespace="Examples"
  xmlns:tns="Examples">

  <message id="newInvoice" name="newInvoiceMessage" />

  <process id="invoiceProcess">

    <startEvent id="messageStart" >
    	<messageEventDefinition messageRef="tns:newInvoice" />
    </startEvent>
    ...
  </process>

</definitions>

信号开始事件

描述

甲信号启动事件可用于使用命名信号来启动一个过程实例。可以使用中间信号抛出事件或通过 API(runtimeService.signalEventReceivedXXX方法)从流程实例内触发信号。在这两种情况下,将启动具有相同名称的信号启动事件的所有流程定义。

请注意,在这两种情况下,还可以在流程实例的同步和异步启动之间进行选择。

在signalName必须在API中传递是在给定的名称name的属性signal被引用的元素signalRef的属性signalEventDefinition。

图形符号 信号开始事件被可视化为带有信号事件符号的圆圈。该符号未填充,以可视化捕捉(接收)行为。

image.png

XML 表示

信号开始事件的 XML 表示是带有 signalEventDefinition 子元素的正常开始事件声明:

<signal id="theSignal" name="The Signal" />

<process id="processWithSignalStart1">
  <startEvent id="theStart">
    <signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal"  />
  </startEvent>
  <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
  <userTask id="theTask" name="Task in process A" />
  <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
	  <endEvent id="theEnd" />
</process>