Flowable—基本概念和重要名詞解釋

Flowable的使用教程

Flowable的用戶使用手冊

Flowable相關的中文官方項目

Flowable工作流引擎的源代碼

Flowable API中的名詞詳解

 其實根據我最近研究流程引擎這一塊,無論是JBPM,還是這個Flowable, 我發現裏面有很多名詞看着很簡單,但是含義都很相近,容易讓人混淆,
 在流程引擎中有很多的名詞和概念是需要我們提前瞭解的,有一些是和流程定義標準有關的,有一些是和流程引擎有關的,
包括一些API會涉及到相關的概念,這裏就不做具體的分別了,直接對涉及到的名詞進行解釋,不明白的可以再下面進行評論:

根據無圖言屌的理論,我們結合着例子講:
圖是流程圖
在這裏插入圖片描述
Xml文檔是流程圖對應的文件:gateway.bpmn20.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:flowable="http://flowable.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.flowable.org/processdef">
  <process id="gateway" name="firstdemo" isExecutable="true">
    <dataObject id="tag" name="Agree" itemSubjectRef="xsd:boolean">
      <extensionElements>
        <flowable:value>true</flowable:value>
      </extensionElements>
    </dataObject>
    <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
    <endEvent id="sid-CFA37A02-2550-4786-B011-66EAAF4FDACD"></endEvent>
    <userTask id="sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C" name="task1" flowable:formFieldValidation="true">
      <documentation>task1</documentation>
      <extensionElements>
        <flowable:executionListener event="start" class="com.example.flowable.CommonExecutionListener"></flowable:executionListener>
        <flowable:taskListener event="create" class="com.example.flowable.CommonTaskListener"></flowable:taskListener>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-D6BA2C14-AF21-483A-86CD-62FB46749709" sourceRef="startEvent1" targetRef="sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C"></sequenceFlow>
    <userTask id="sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D" name="task2" flowable:formFieldValidation="true">
      <documentation>task2</documentation>
    </userTask>
    <sequenceFlow id="sid-3A682C50-C566-49C5-9C9E-9F12E14328FB" sourceRef="sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C" targetRef="sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D"></sequenceFlow>
    <userTask id="sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA" name="task3" flowable:formFieldValidation="true">
      <documentation>task3</documentation>
    </userTask>
    <sequenceFlow id="sid-BC67636C-EBD6-435A-B9CE-8774F2276498" sourceRef="sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA" targetRef="sid-CFA37A02-2550-4786-B011-66EAAF4FDACD"></sequenceFlow>
    <sequenceFlow id="sid-F4DD7025-CDCE-491A-8A4A-C096CBA5E691" sourceRef="sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D" targetRef="sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7"></sequenceFlow>
    <parallelGateway id="sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7"></parallelGateway>
    <sequenceFlow id="sid-ADA36BBE-B044-4329-9A87-3BEA833D6938" sourceRef="sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7" targetRef="sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA"></sequenceFlow>
    <userTask id="sid-053E623B-74BB-46D0-82BB-A14AF439A902" name="task4" flowable:formFieldValidation="true">
      <documentation>task4</documentation>
    </userTask>
    <sequenceFlow id="sid-E37EB023-0A51-4322-BB99-CE980DD5A01E" sourceRef="sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7" targetRef="sid-053E623B-74BB-46D0-82BB-A14AF439A902"></sequenceFlow>
    <endEvent id="sid-DB2195E9-4557-4EA6-A758-C7D8FE21F0AE"></endEvent>
    <sequenceFlow id="sid-FAD95623-29CE-4EFC-9415-36D2E92FCA9C" sourceRef="sid-053E623B-74BB-46D0-82BB-A14AF439A902" targetRef="sid-DB2195E9-4557-4EA6-A758-C7D8FE21F0AE"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_gateway">
    <bpmndi:BPMNPlane bpmnElement="gateway" id="BPMNPlane_gateway">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="15.0" y="167.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-CFA37A02-2550-4786-B011-66EAAF4FDACD" id="BPMNShape_sid-CFA37A02-2550-4786-B011-66EAAF4FDACD">
        <omgdc:Bounds height="28.0" width="28.0" x="1050.0" y="41.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C" id="BPMNShape_sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C">
        <omgdc:Bounds height="88.0" width="178.0" x="180.0" y="138.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D" id="BPMNShape_sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D">
        <omgdc:Bounds height="80.0" width="100.0" x="420.0" y="142.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA" id="BPMNShape_sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA">
        <omgdc:Bounds height="80.0" width="100.0" x="660.0" y="15.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7" id="BPMNShape_sid-FDBE9C91-7195-4FD5-9CF1-B2DA1794ADC7">
        <omgdc:Bounds height="40.0" width="40.0" x="565.0" y="162.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-053E623B-74BB-46D0-82BB-A14AF439A902" id="BPMNShape_sid-053E623B-74BB-46D0-82BB-A14AF439A902">
        <omgdc:Bounds height="80.0" width="100.0" x="675.0" y="270.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-DB2195E9-4557-4EA6-A758-C7D8FE21F0AE" id="BPMNShape_sid-DB2195E9-4557-4EA6-A758-C7D8FE21F0AE">
        <omgdc:Bounds height="28.0" width="28.0" x="1050.0" y="296.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-F4DD7025-CDCE-491A-8A4A-C096CBA5E691" id="BPMNEdge_sid-F4DD7025-CDCE-491A-8A4A-C096CBA5E691">
        <omgdi:waypoint x="519.949999999998" y="182.21623376623378"></omgdi:waypoint>
        <omgdi:waypoint x="565.4130434782609" y="182.41304347826087"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-BC67636C-EBD6-435A-B9CE-8774F2276498" id="BPMNEdge_sid-BC67636C-EBD6-435A-B9CE-8774F2276498">
        <omgdi:waypoint x="759.9499999999999" y="55.0"></omgdi:waypoint>
        <omgdi:waypoint x="1050.0" y="55.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-3A682C50-C566-49C5-9C9E-9F12E14328FB" id="BPMNEdge_sid-3A682C50-C566-49C5-9C9E-9F12E14328FB">
        <omgdi:waypoint x="357.94999999989125" y="182.0"></omgdi:waypoint>
        <omgdi:waypoint x="419.9999999999576" y="182.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-FAD95623-29CE-4EFC-9415-36D2E92FCA9C" id="BPMNEdge_sid-FAD95623-29CE-4EFC-9415-36D2E92FCA9C">
        <omgdi:waypoint x="774.9499999999999" y="310.0"></omgdi:waypoint>
        <omgdi:waypoint x="1050.0" y="310.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-ADA36BBE-B044-4329-9A87-3BEA833D6938" id="BPMNEdge_sid-ADA36BBE-B044-4329-9A87-3BEA833D6938">
        <omgdi:waypoint x="595.3562499999999" y="172.3809523809524"></omgdi:waypoint>
        <omgdi:waypoint x="670.9411764705883" y="94.95"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-D6BA2C14-AF21-483A-86CD-62FB46749709" id="BPMNEdge_sid-D6BA2C14-AF21-483A-86CD-62FB46749709">
        <omgdi:waypoint x="44.94999967996604" y="182.0"></omgdi:waypoint>
        <omgdi:waypoint x="180.0" y="182.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-E37EB023-0A51-4322-BB99-CE980DD5A01E" id="BPMNEdge_sid-E37EB023-0A51-4322-BB99-CE980DD5A01E">
        <omgdi:waypoint x="595.4006832646949" y="191.54915730337075"></omgdi:waypoint>
        <omgdi:waypoint x="681.2320658565268" y="270.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>
  • Process Definition
    ProcessDefination就類似於一個模板,像java中的類一樣,
  • Process Instance
    Process Instance 就是具體的Process Defination對應的流程實例,類似於Java中的實例
  • Activity

JAVA Activity是流程標準規範BPMN2.0裏面的規範,流程中的每一個步驟都是一個Activity,也就是說上面的這個流程圖中有4個Activity, 其實就是上面的四個task,activity是主要BPMN中的主要節點,再具體一點,我一一列出來:

 <userTask id="sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C" name="task1" flowable:formFieldValidation="true">
   <documentation>task1</documentation>
   <extensionElements>
     <flowable:executionListener event="start" class="com.example.flowable.CommonExecutionListener"></flowable:executionListener>
     <flowable:taskListener event="create" class="com.example.flowable.CommonTaskListener"></flowable:taskListener>
   </extensionElements>
 </userTask>
 <userTask id="sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D" name="task2" flowable:formFieldValidation="true">
   <documentation>task2</documentation>
 </userTask>
	<userTask id="sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA" name="task3" flowable:formFieldValidation="true">
     <documentation>task3</documentation>
   </userTask>
 	<userTask id="sid-053E623B-74BB-46D0-82BB-A14AF439A902" name="task4" flowable:formFieldValidation="true">
      <documentation>task4</documentation>
    </userTask>
  • Execution
這個是個比較解釋的名詞,Execution的含義是流程的執行線路,爲什麼這麼說呢?
因爲通過Execution可以獲得當前ProcessInstance當前執行到那個Activity了,
ProcessInstance接口也實現了Execution接口,

流程進行到task1的時候
這裏說一下打印臺打印的內容:我是通過運行時環境裏面拿到實時的Execution,打印方式是:第一行打印executionList裏面execution的個數,然後後面遍歷這些Execution,每個作爲一行打印 開頭均以"execution = "開始.

此時的Execution打印:

init   executionListlist.size() = 2
init   execution = ProcessInstance[cab66306-10ef-11ea-ac73-1c872c5f4209]
init   execution = Execution[ id 'cab6b128-10ef-11ea-ac73-1c872c5f4209' ] - activity 'sid-18AB5E62-1C9E-489A-97A8-6C2E55A7BD0C' 
- parent 'cab66306-10ef-11ea-ac73-1c872c5f4209'
我們可以看到當執行到task1的時候execution有兩個,一個Execution是Processinstance 另外一個Execution他的parent是processinstance 
(根據Id確定的)然後我們可以從第二個Execution的屬性裏面看到 activity對應的節點的Id,
我們對照上面的xml文檔裏面的內容剛好對應的就是task節點的id

下面我們再看一下complete task1後的:

流程進行到task2的時候

task1   executionListlist.size() = 2
task1   execution = ProcessInstance[cab66306-10ef-11ea-ac73-1c872c5f4209]
task1   execution = Execution[ id 'cab6b128-10ef-11ea-ac73-1c872c5f4209' ] - activity 'sid-F196283E-CC9A-4BBA-9B91-B9E59D52D96D' 
- parent 'cab66306-10ef-11ea-ac73-1c872c5f4209'
按照上面task1的時候的分析

下面我們在看下complete task2後的:

task2   executionListlist.size() = 3
task2   execution = Execution[ id '9ee4f862-10f1-11ea-9a3d-1c872c5f4209' ] - activity 'sid-053E623B-74BB-46D0-82BB-A14AF439A902' 
- parent 'cab66306-10ef-11ea-ac73-1c872c5f4209'
task2   execution = ProcessInstance[cab66306-10ef-11ea-ac73-1c872c5f4209]
task2   execution = Execution[ id 'cab6b128-10ef-11ea-ac73-1c872c5f4209' ] - activity 'sid-BBCDB2E1-6419-43D2-8532-8D3FC28E49DA' 
- parent 'cab66306-10ef-11ea-ac73-1c872c5f4209'
我們現在看下這裏有三個execution,除了processInstance之外還有兩個Execution,而這兩個execution的activity對應的 
分別是Task3和Task4節點的id,爲什麼會這樣呢?因爲我們的task2後面是個平行網關,也就是說我們執行Complete task2以後,
task3和task4都可以執行,相當於兩條執行路徑,所以有兩個對應的execution。
  • assignee和owner
這個是針對usertask類型的activity的,一個task我們既可以給他設定assignee也可以設定owner,assignee的含義就是這個task是由誰負責的,
owner是assignee可以指定的那個人,比如一個task的assignee是jack 然後他不想執行可以爲這個task設置一個owner,比如是rose,
那這個任務就可以由rose執行
綜上我們可以明白execution的意義了,這也是爲什麼我們說execution是執行路徑。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章