1. 程式人生 > >Activiti BPMN 2.0 學習心得

Activiti BPMN 2.0 學習心得

authent rms sig 處理器 mod def 錯誤 執行者 event

更清晰的排版見 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:***

前綴的都是Activiti擴展的內容

Event 類型

Event用於將流程生命周期內發生的某些事情模型化 事件主要分為兩種:

  1. Catching: 當流程執行到這類事件時會等待直到觸發器執行
  2. 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配置大致如下:

```(xml) <definitions... > <!-- declaration of the signal --> <signal id="alertSignal" name="alert" />
<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配置大致如下:

```(xml) <definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples" xmlns:tns="Examples">
<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> ```

拋出消息事件

拋出消息有兩種情況

  1. 消息需要觸發新的執行實例
  2. 消息需要被已經存在的執行實例接收

兩種情況 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 學習心得