Activiti BPMN 2.0 學習心得
更清晰的排版見 https://github.com/hauxsoft-java-group1/activiti/wiki
BPMN 2.0 結構
本文主要是對 官方文檔 v 6.0.0 中對BPMN 2.0 結構介紹的翻譯
類似文章有liujie037的 Activiti工作流學習-----基於5.19.0版本(7)
ps.明顯能從ActivitiDesigner配置的內容,如每個組件的具體形狀,在這裏暫時就不贅述了
基礎概念
Activiti對 BPMN 2.0 做了一些擴展,為其添加了一些自己的XML元素與屬性,它們的命名空間都會有類似 activiti:***
的前綴,換句話說,有activiti:***
Event 類型
Event用於將流程生命周期內發生的某些事情模型化 事件主要分為兩種:
- Catching: 當流程執行到這類事件時會等待直到觸發器執行
- Throwing: 當流程執行到這類事件時會觸發觸發器
兩者的觸發器都通過內部元素或xml文件配置
即一種是被動觸發,一種是主動觸發
Timer Event 類型
定時事件
BPMN 2.0 時間格式統一遵循 ISO 8601
標簽 | 說明 | 示例 |
---|---|---|
timeDate | 觸發觸發器的時間 | 2011-03-11T12:13:14 |
timeDuration | 觸發器被觸發後運行前需要等待的時間 | P10D (10天) |
timeCycle | 設定重復間隔,支持多種格式 | R3/PT10H (重復3次,每次10小時) |
支持設置結束時間,如R3/PT10H/${"2015-02-25T16:42:11+00:00"}表示當到達EndDate後觸發器停止工作 (待測試)
timeCycle標簽也支持 cron 表達式, 如 0 0/5 * * * ? 表示每5分鐘觸發一次,可以在這裏測試Cron表達式生成器
Error Event 類型
工作流程上的錯誤事件類型,與Java處理異常沒有關系,
<endEvent id="myErrorEndEvent"> <errorEventDefinition errorRef="myError" /> </endEvent>Signal Event 類型
Signal (信號) 是指作用於 全局域(global scope)且被 所有 激活的處理器(某些等待信號的執行實例或捕獲信號的事件)接收的事件。
Signal 直接在根標簽definitions標簽下聲明,與process標簽同級,目前只能直接寫在xml文件中,暫未發現用ActivitiDesigner如何聲明
聲明了Signal後可在相關組件處引用,這個ActivitiDesigner就支持了,xml配置大致如下:
<process id="catchSignal"> <intermediateThrowEvent id="throwSignalEvent" name="Alert"> <!-- signal event definition --> <signalEventDefinition signalRef="alertSignal" /> </intermediateThrowEvent> ... <intermediateCatchEvent id="catchSignalEvent" name="On Alert"> <!-- signal event definition --> <signalEventDefinition signalRef="alertSignal" /> </intermediateCatchEvent> ... </process> </definitions> ```
拋出信號事件
Signal可以被BPMN結構拋出,也可以調用java API拋出:
RuntimeService.signalEventReceived(String signalName); RuntimeService.signalEventReceived(String signalName, String executionId); // 指定執行對象查詢信號事件(Signal Event)訂閱情況
List<Execution> executions = runtimeService.createExecutionQuery() .signalEventSubscriptionName("alert") .list();修改信號作用域
<signal id="alertSignal" name="alert" activiti:scope="processInstance"/>
activiti:scope 默認值為global
信號事件圖例
Message Event 類型
信息事件,一個消息由名稱與載荷組成,與信號事件不同,消息事件總是 只有一個接收者
與信號事件一樣,在根標簽definitions下聲明
xml配置大致如下:
<message id="newInvoice" name="newInvoiceMessage" /> <message id="payment" name="paymentMessage" />
<process id="invoiceProcess">
<startEvent id="messageStart" > <messageEventDefinition messageRef="newInvoice" /> </startEvent> ... <intermediateCatchEvent id="paymentEvt" > <messageEventDefinition messageRef="payment" /> </intermediateCatchEvent> ... </process>
</definitions> ```
拋出消息事件
拋出消息有兩種情況
- 消息需要觸發新的執行實例
- 消息需要被已經存在的執行實例接收
兩種情況 runtime service 都提供了相應的方法處理
查詢消息訂閱情況
對於StartEvent的訂閱,repository service 提供了相應的方法:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .messageEventSubscription("newCallCenterBooking") .singleResult();對於中間層的訂閱,有如下方法可以查詢:
Execution execution = runtimeService.createExecutionQuery() .messageEventSubscriptionName("paymentReceived") .variableValueEquals("orderId", message.getOrderId()) .singleResult();消息事件圖例
靠兩種不同的消息來啟動流程
Start Event 類型
流程開始的事件,總是處於等待被觸發的狀態
標簽 | 說明 | 示例 |
---|---|---|
initiator | Activiti 擴展的屬性,用於記錄開始流程時權限用戶(管理員)的ID |
initiator 需要通過如下方式設置:
try { identityService.setAuthenticatedUserId("bono"); runtimeService.startProcessInstanceByKey("someProcessKey"); } finally { identityService.setAuthenticatedUserId(null); }具體Event
None Start Event
不是由觸發器觸發的開始事件
就是ActivitiDesigner裏的StartEvent
由如下方式觸發ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();
標簽 | 說明 | 示例 |
---|---|---|
formKey | Activiti擴展的屬性,引用一個啟動時需要填充的表單模板 |
Timer Start Event
定時開始事件,(定時 + 開始)事件
子流程不能有定時開始事件
當流程部署時就開始自動計時
當新流程部署時項目中舊流程的定時開始事件會被移除
詳見 定時事件類型
Message Start Event
事件名稱必須唯一,具體看文檔... 部署新版本後舊版本會被取消
詳見 消息事件類型
Signal Start Event
詳見事件類型描述
Sequence Flow 順序流程 (一對一)
Gateways 擴展流程 (一對多)(又稱網關) Gateways
Task 任務
User Task
activiti:assignee
指定執行者
Sub-Processes and Call Activities
事務與並發
Forms
Activiti 內置隱式變量
All information relevant to a business process is either included in the process variables themselves or referenced through the process variables. Activiti supports complex Java objects to be stored as process variables like Serializable objects, JPA entities or whole XML documents as Strings.
Java處理異常
Activiti BPMN 2.0 學習心得