StartEvent組件
StartEvent總述
StartEvent分爲五種,第一種爲普通StartEvent,第二種爲帶定時器的SatrtEvent,第三種爲接收消息的StartEvent,第四種爲帶錯誤信息的StartEvent這種最爲特殊,下文會詳細來說。第五種爲帶信號的StartEvent從這篇文章主要講工作流的StartEvent。下面開始逐一講解。
MessageStartEvent(消息啓動組件)
注意事項(摘自官網)
- MessageStartEvent的name在給定的流程定義中必須是唯一的。流程定義不能具有多個具有相同name的MessageStartEvent。如果兩個或多個MessageStartEvent引用具有相同消息名稱的消息,則Activiti在部署流程定義時拋出異常。
- MessageStartEvent的name在所有已部署的流程定義中必須是唯一的。如果一個或多個消息啓動事件引用與已經由不同流程定義部署的MessageStartEvent同名的消息,則Activiti在部署流程定義時拋出異常【劃重點了要考啊,簡單說別重名吧】。
- 流程版本控制:部署新版本的流程定義後,將取消先前版本的消息訂閱。對於新版本中不存在的消息事件也是如此。
- MessageStartEvent僅在頂級流程上受支持。嵌入式子流程不支持消息啓動事件。
- 如果一個流程定義有多個消息開始的事件和一個無啓動的事件,
runtimeService.startProcessInstanceByKey(…)和runtimeService.startProcessInstanceById(…)使用無啓動事件啓動流程實例。 - 如果一個流程定義有多個消息開始的事件,並沒有無啓動事件,
runtimeService.startProcessInstanceByKey(…)和runtimeService.startProcessInstanceById(…)拋出一個異常。 - 如果一個流程定義有一個消息開始的事件,runtimeService.startProcessInstanceByKey(…)和runtimeService.startProcessInstanceById(…)使用消息開始的事件開始一個新的流程實例。
流程圖總覽
XML代碼
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<message id="msg" name="msgName"></message>
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="messagestartevent1" name="Message start">
<messageEventDefinition>
<messageEventDefinition messageRef="msg"></messageEventDefinition>
</messageEventDefinition>
</startEvent>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="messagestartevent1" id="BPMNShape_messagestartevent1">
<omgdc:Bounds height="35.0" width="35.0" x="260.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
注意
這個屬性冒似只能在XML內設置,這個爲需要傳入的message。如下:
@Test
public void MessageTest() throws InterruptedException{
Deployment deployment = repositoryService.createDeployment()
.name("MessageStart")
.addClasspathResource("bpmn/MessageStart.bpmn")
.addClasspathResource("bpmn/MessageStart.png")
.deploy();
ProcessInstance pi = runtimeService.startProcessInstanceByMessage("msgName");
//ProcessInstance pi = runtimeService.startProcessInstanceByKey("MessageStart");
System.out.println(pi.getId());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.messageEventSubscriptionName("msgName")
.singleResult();
//測試查詢消息方法
System.out.println(processDefinition.getDeploymentId()+" "+deployment.getId());
}
}
注意:這個時候以messageName可以完成部署,同時原來的老方式也仍然會執行。建議這種情況只使用message方式啓動流程實例
官網的典型應用場景
SignalStartEvent(信號啓動組件)
所謂信號,類似一種廣播模式
流程圖
XML代碼
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<signal id="Signal" name="SignalPTM"></signal>
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="signalstartevent1" name="Signal start">
<signalEventDefinition signalRef="Signal"></signalEventDefinition>
</startEvent>
<userTask id="usertask1" name="User Task"></userTask>
<sequenceFlow id="flow1" sourceRef="signalstartevent1" targetRef="usertask1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="signalstartevent1" id="BPMNShape_signalstartevent1">
<omgdc:Bounds height="35.0" width="35.0" x="200.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="280.0" y="190.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="235.0" y="217.0"></omgdi:waypoint>
<omgdi:waypoint x="280.0" y="217.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
設置如下:
測試代碼
@Test
public void signalEvent() throws InterruptedException{
Deployment deployment = repositoryService.createDeployment()
.name("SignalEvent")
.addClasspathResource("bpmn/SignalEvent.bpmn")
.addClasspathResource("bpmn/SignalEvent.png")
.deploy();
long dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep前流程實例數量:" + dataCount);
runtimeService.signalEventReceived("SignalPTM");
dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep後流程實例數量:" + dataCount);
}
【注意:信號爲多播事件,一般由信號中間件或後臺執行方法發出信號,ref裏面有該信號的所有組件將接收到信號,開始執行】
ErrorStartEvent(錯誤啓動組件)
錯誤啓動組件只能放在事件子流程中使用,爲對應error信號被觸發時調用。demo的話將在下一貼的第一個demo內講解。與ErrorEndEvent一起講解。