Activiti 6.x【6】StartEvent(上)
StartEvent元件
StartEvent總述
StartEvent分為五種,第一種為普通StartEvent,第二種為帶定時器的SatrtEvent,第三種為接收訊息的StartEvent,第四種為帶錯誤資訊的StartEvent這種最為特殊,下文會詳細來說。第五種為帶訊號的StartEvent從這篇文章主要講工作流的StartEvent。下面開始逐一講解。
StartEvent(普通)
StartEvent為一個流程的起始點,我們來看看官網是如何描述的: StartEvent(普通)對應的XML內程式碼如下
<startEvent id="startevent1" name="Start"></startEvent>
activiti:initiator="initiator"
這個部分,activiti:initiator:在程序啟動時將儲存使用者標識的變數名稱。以initiator為UserId。一般設定這個是和form聯用的【emmm我是不會去用的】。這裡就是告訴大家可以用xml開啟bpmn的程式碼有這個屬性設定。通過eclipse外掛可以直接如下圖這樣設定。
老規矩跑起來試試
可以看到已經進了歷史資料表了【因為已經啟動了start這個例項被執行了就進入了歷史表】 starter:以這種方式設定就會是starter participant:任務辦理人,建議以流程變數的方式指定 candidate:候選人,組任務那塊可以指定
TimerStartEvent(定時器啟動元件)
TimerStartEvent對應的XML內程式碼如下【未做任何設定的TimerStartEvent】
<startEvent id="timerstartevent1" name="Timer start">
<timerEventDefinition></timerEventDefinition>
</startEvent>
計時器啟動事件用於在給定時間建立流程例項。它既可以用於應該只啟動一次的程序,也可以用於應該以特定時間間隔啟動的程序。
注意【摘自官網】:
- 子流程不能有TimerStartEvent。
- 一旦部署了程序,就會安排TimerStartEvent。不需要呼叫startProcessInstanceByXXX方法,雖然呼叫start process方法不受限制,並且會在startProcessInstanceByXXX Invocation時再啟動一個程序。
- 當部署具有TimerStartEvent的新版本的程序時,將刪除與先前計時器對應的作業。原因是通常不希望自動啟動此舊版本流程的新流程例項。
使用的方式呢就是使用如下三個標籤控制定時器開始事件。接下來是demo了。
TiemCycle【按時間迴圈啟動】
流程圖總覽【UserTask以及後面的完全沒有設定,for流程完整性和方便檢視執行效果】
流程圖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="TiemCycle">
<process id="TiemCycle" name="TiemCycle" isExecutable="true">
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="User Task"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
<startEvent id="timerstartevent1" name="Timer start">
<timerEventDefinition>
<timeCycle>0/5 * * * * ?</timeCycle>
</timerEventDefinition>
</startEvent>
<sequenceFlow id="flow3" sourceRef="timerstartevent1" targetRef="usertask1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_TiemCycle">
<bpmndi:BPMNPlane bpmnElement="TiemCycle" id="BPMNPlane_TiemCycle">
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="490.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="290.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="timerstartevent1" id="BPMNShape_timerstartevent1">
<omgdc:Bounds height="35.0" width="35.0" x="160.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="395.0" y="187.0"></omgdi:waypoint>
<omgdi:waypoint x="490.0" y="187.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="195.0" y="187.0"></omgdi:waypoint>
<omgdi:waypoint x="290.0" y="187.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
corn 表示式
這個代表每分鐘的第0秒開始每五秒鐘呼叫一次。【生成Corn表示式的網站,不必刻意去記憶 http://cron.qqe2.com/】
【ISO 8601方式】重複5次,每次間隔10小時
<timeCycle activiti:endDate="2019-09-12T21:42:00+00:00">R5/PT10H</timeCycle>
<timeCycle>R5/2019-10-07T12:00/PT10H</timeCycle>//這個是開始時間
測試程式碼
TimeDate【定時啟動】
流程圖總覽
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">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="timerstartevent1" name="Timer start">
<timerEventDefinition>
<timeDate>2018-09-12T17:20:00</timeDate>
</timerEventDefinition>
</startEvent>
<userTask id="usertask1" name="User Task"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow1" sourceRef="timerstartevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="timerstartevent1" id="BPMNShape_timerstartevent1">
<omgdc:Bounds height="35.0" width="35.0" x="210.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="360.0" y="230.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="590.0" y="240.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="245.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="360.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="465.0" y="257.0"></omgdi:waypoint>
<omgdi:waypoint x="590.0" y="257.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
時間的格式是有要求的
直接部署流程五點20時檢視是否已經自動生成流程例項
@Test
public void TimeDate() throws InterruptedException{
Deployment deployment = repositoryService.createDeployment()
.name("TimeDate")
.addClasspathResource("bpmn/TimeDate.bpmn")
.addClasspathResource("bpmn/TimeDate.png")
.deploy();
long dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep前流程例項數量:" + dataCount);
Thread.sleep(60000L);//
dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep後流程例項數量:" + dataCount);
}
【單元測試執行緒程式碼執行完則退出,不會像主執行緒一樣等待子執行緒退出而退出, 會直接退出。Junit單元測試不支援多執行緒。主執行緒退出,子執行緒也會退出。】
@Test
public void TimeDate() throws InterruptedException{
Deployment deployment = repositoryService.createDeployment()
.name("TimeDate")
.addClasspathResource("bpmn/TimeDate.bpmn")
.addClasspathResource("bpmn/TimeDate.png")
.deploy();
long dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep前流程例項數量:" + dataCount);
Thread.sleep(60000L);//
dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep後流程例項數量:" + dataCount);
}
【單元測試執行緒程式碼執行完則退出,不會像主執行緒一樣等待子執行緒退出而退出, 會直接退出。Junit單元測試不支援多執行緒。主執行緒退出,子執行緒也會退出。】
TimeDuration【定時啟動】
微改一下,這裡稍微偷懶一下啦。
@Test
public void TimeDate() throws InterruptedException{
Deployment deployment = repositoryService.createDeployment()
.name("TimeDate")
.addClasspathResource("bpmn/TimeDate.bpmn")
.addClasspathResource("bpmn/TimeDate.png")
.deploy();
long dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep前流程例項數量:" + dataCount);
Thread.sleep(5000L);
dataCount = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep後流程例項數量:" + dataCount);
}