Activiti 6.x【7】StartEvent(下)

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一起講解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章