在BPMN2.0规范中,消息表示的是流程参与者的沟通信息对象,在一般流程中,流程的各个角色的沟通信息均有可能导致流程的开始。流程开始事件,可以理解为另外一种启动流程的方式或者途径,使用该开始事件,当达到“接收消息”的条件后启动流程。下面将给出一个实例来说明消息开始事件的使用。
消息事件图标:
定义元素:
<message id="myMessage" name="myMessageName"></message>
定义了一个名称为myMessage的消息,消息值为myMessageName
<messageEventDefinition messageRef="myMessage"></messageEventDefinition>
定义消息事件
注意事项:
1、message标签定义一条信息,然后使用messageEventDefinition元素引用message
2、startProcessByMessage方法中需要传入message标签的name属性定义的值,这就能启动该流程
3、在全部流程定义中,只能有一个开始事件引用该消息
4、如果流程中有多个消息开始事件,那么如何启动流程将由调用的API参数决定
5、如果一个流程中既有消息开始事件、无指定开始事件。那么在使用startProcessById或startProcessByKey方法时,将会使用无指定开始事件启动流程。
6、如果一个流程中有多个开始事件而没有无指定开始事件,那么在使用startProcessByKey或startProcessById方法启动流程时会抛出异常。
7、如果流程中只有一个消息开始事件,那么在使用startProcessById或者startProcessByKey方法启动流程时,默认使用消息开始事件启动流程。
8、如果被启动的流程是一个调用子流程并且有多个开始事件,那么该流程定义中除了含有消息开始事件外,还需要有一个无指定开始是;或者该调用子流程中只有一个消息开始事件。
实例流程图:
上面定义了消息开始事件,当这个消息开始事件收到特定的消息(这里是myMessageName),则触发该消息开始事件,流程进入任务01(手动结束该任务),然后流程结束。
流程XML定义:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="https://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="https://activiti.org/bpmn" xmlns:bpmndi="https://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="https://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="https://www.omg.org/spec/DD/20100524/DI" typeLanguage="https://www.w3.org/2001/XMLSchema" expressionLanguage="https://www.w3.org/1999/XPath" targetNamespace="https://www.activiti.org/processdef"> <!-- 定义消息 --> <message id="myMessage" name="myMessageName"></message> <process id="messageStartEventTest01" name="消息开始事件测试01" isExecutable="true"> <!-- 定义消息开始事件 --> <startEvent id="start"> <messageEventDefinition messageRef="myMessage"></messageEventDefinition> </startEvent> <userTask id="task01" name="任务01"></userTask> <endEvent id="end"></endEvent> <sequenceFlow id="sid-35F14E43-5255-4FCC-8962-209578CDE088" sourceRef="task01" targetRef="end"></sequenceFlow> <sequenceFlow id="sid-26E938F5-B655-4C30-B65E-85CB82F630DD" sourceRef="start" targetRef="task01"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_messageStartEventTest01"> <bpmndi:BPMNPlane bpmnElement="messageStartEventTest01" id="BPMNPlane_messageStartEventTest01"> <bpmndi:BPMNShape bpmnElement="task01" id="BPMNShape_task01"> <omgdc:Bounds height="80.0" width="100.0" x="191.0" y="125.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end"> <omgdc:Bounds height="28.0" width="28.0" x="336.0" y="151.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start"> <omgdc:Bounds height="30.0" width="30.0" x="110.0" y="150.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-26E938F5-B655-4C30-B65E-85CB82F630DD" id="BPMNEdge_sid-26E938F5-B655-4C30-B65E-85CB82F630DD"> <omgdi:waypoint x="140.0" y="165.0"></omgdi:waypoint> <omgdi:waypoint x="191.0" y="165.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-35F14E43-5255-4FCC-8962-209578CDE088" id="BPMNEdge_sid-35F14E43-5255-4FCC-8962-209578CDE088"> <omgdi:waypoint x="291.0" y="165.0"></omgdi:waypoint> <omgdi:waypoint x="336.0" y="165.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
Activiti配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="aaaaaa" /> <property name="jobExecutorActivate" value="true" /> <property name="databaseType" value="mysql"/> <property name="databaseSchemaUpdate" value="true" /> <property name="history" value="full"/> </bean> </beans>
Java客户端代码:
package com.bug315.event; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; /** * 消息开始事件 * @author Administrator * */ public class MessageStartEventTest01 { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = engine.getRepositoryService(); repositoryService.createDeployment().addClasspathResource("bpmn/messageStartEventTest01.bpmn20.xml").deploy(); RuntimeService runtimeService = engine.getRuntimeService(); runtimeService.startProcessInstanceByMessage("myMessageName"); System.out.println("流程实例数量:" + runtimeService.createProcessInstanceQuery().count()); } }
注意事项:
1、使用startProcessByMessage方法启动流程