一 : 重要概念
1 : process definition(流程定義):
工作流的流程的完整定義,包括節點和節點之間的走向等關鍵信息。通常以xml格式提供。一個具體的系統往往是由許多個流程組成的。
2 : process instance(流程實例):
每個process defination生成的業務層的實例。當process instance創建以后,代表流程的執行路徑,并被定義到開始節點。
3 : token(令牌):
表示了一個執行的路徑,它是運行時產生的。當實例建立以后,令牌也就產生了。
4 : node:
表示流程中的一個節點。
5 : transition:
關聯兩個節點,用于表示節點的走向
6 : signal:
讓一個token執行下一步。process instance也有signal,當用process instance的signal時,其實就是運行process instance根令牌(root token)的signal. 當token進入到一個node時,node會被執行,并產生一些事件,比如進入、離開節點等,這也是執行業務邏輯的地方。事件由action來表示。
7 : 事件Event
Event反映的是流程執行中的各個時刻。在流程執行中JBPM引擎會在計算下一個狀態的時候觸發各種事件。一個事件通常和流程定義中的一個元素相關聯,比如流程定義本身,節點或者轉移。大部分的元素能夠觸發不同類型的事件,比如一個節點可以觸發節點進入事件,節點離開事件。事件其實是和動作連接在一起的。每個事件維護一個動作列表。當JBPM引擎觸發一個事件的時候,該事件維護的動作列表中的動作將被執行。
事件類型
在JBPM中事件類型是寫死在事件類中的,共有16種:
EVENTTYPE_TRANSITION = "transition"; // 轉移
EVENTTYPE_BEFORE_SIGNAL = "before-signal"; // 發信號前
EVENTTYPE_AFTER_SIGNAL = "after-signal"; // 發信號后
EVENTTYPE_PROCESS_START = "process-start"; // 處理開始狀態
EVENTTYPE_PROCESS_END = "process-end"; // 處理結束狀態
EVENTTYPE_NODE_ENTER = "node-enter"; // 進入節點
EVENTTYPE_NODE_LEAVE = "node-leave"; // 離開節點
EVENTTYPE_SUPERSTATE_ENTER = "superstate-enter"; // 進入超級狀態
EVENTTYPE_SUPERSTATE_LEAVE = "superstate-leave"; // 離開超級狀態
EVENTTYPE_SUBPROCESS_CREATED = "subprocess-created"; // 子流程創建
EVENTTYPE_SUBPROCESS_END = "subprocess-end"; // 子流程結束
EVENTTYPE_TASK_CREATE = "task-create"; // 任務創建
EVENTTYPE_TASK_ASSIGN = "task-assign"; // 任務分派
EVENTTYPE_TASK_START = "task-start"; // 任務啟動
EVENTTYPE_TASK_END = "task-end"; // 任務結束
EVENTTYPE_TIMER = "timer"; // 定時器
二 : 常用 API
ProcessInstance是ProcessDefinition的一個執行實例,想象一下對于訂票流程,每個客戶的訂票動作都會根據訂票流程定義而創建一個流程實例,也就是執行實例ProcessInstance.當一個ProcessInstance被創建后,負責執行主路徑的token也被創建,這個token就是根token(root token),根token此時位于流程定義的開始狀態start state.
創建執行實例很簡單有2種方式 :
1 : 通過 ProcessDefinition 類的 createProcessInstance() 方法
//得到 processDefinition
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("processdefinition.xml");
//通過 processDefinition 創建 出 processInstance
ProcessInstance processInstance = processDefinition.createProcessInstance();
2 :通過 ProcessInstance 類的 構造函數
//得到 jbpmContext
JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();

//得到 processDefinition
ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("baoxiao");

//得到 processInstance
ProcessInstance processInstance = new ProcessInstance(processDefinition);