首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

jBPM 進階人工任務模式實戰:四眼原則、任命、升級與鏈式執行

     編輯:Java 相關知識

人工任務交互模式的必要性

通用業務流程常涉及人工參與,從簡單人工核准到複雜資料輸入,引入人工交互模式:

  • 四眼原則 (Four-Eyes Principle):又稱「職責分離」,決策需多人獨立作出,易獲取另一觀點/簽名。
  • 任命:主管依團隊任務安排、負載、經驗手動分派任務。
  • 升級:任務未按預期進展時觸發:重新分派(附通知)或通知管理者逾期未完成。
  • 鏈式執行:流程片段中一系列步驟由同一人完成。

jBPM 任務管理核心

  • 任務定義於任務節點,單節點可含多任務。流程執行至任務節點等待所有任務完成才繼續。
  • 任務可指派給個人、用戶組、泳道:指派個人僅該用戶可執行;指派用戶組(用「參與者池」符號)組員均可執行,但需先從組任務列表「搶佔」至個人列表避免衝突;泳道代表流程角色,首個任務指派後,同泳道後續任務自動由同一參與者完成。
  • 指派方式:流程定義中靜態指定、運算式動態決定、編程實作 `AssignmentHandler` 任意規則查找用戶。
  • 任務實例:運行時表示,擁有流程變數存取權與自身變數。自身變數用途:建立流程變數副本(完成提交才影響流程)、衍生計算變數支援用戶活動。由 `TaskControllerHandler` 處理:建立時從流程數據生成,完成時提交回流程。

實現四眼原則:擴展 Task 與 TaskInstance

遵循 jBPM 最佳實踐「擴展 API 而非複雜建模」,採用任務內解決方案,修改 `Task`、`TaskInstance` 類別。

1. 擴展 Task 類別

新增 `numSignatures` 欄位(預設 1),指定任務完成所需處理人數。Getter/Setter 標準寫法。

Hibernate 映射檔 `Task.hbm.xml` 新增:

<property name="numSignatures" column="NUMSIGNATURES_" />

修改 `JpdlXmlReader` 讀取屬性:

String numSignatureText = taskElement.attributeValue("numSignatures");
if (numSignatureText != null) {
    try { task.setNumSignatures(Integer.parseInt(numSignatureText)); } catch(Exception e){}
}

XSD `jpdl-3.2.xsd` 增加屬性定義:

<xs:attribute name="numSignatures" type="xs:string" />

流程定義即可使用:

<task name="task2" numSignatures="2">
  <assignment pooled-actors="Peter, John"/>
</task>

2. 擴展 TaskInstance 類別

自定 `AssignableTaskInstance` 繼承 `TaskInstance`,追蹤指派參與者並確保全數完成。核心邏輯:

  • `reserve(userID)`:檢查任務存在、避免重複指派、未超過 `numSignatures` 才加入指派清單。
  • `unreserve(userID)`:移除指派。
  • `complete(userID, transition)`:驗證指派者、標記完成時間、計算已完成數,達 `numSignatures` 才結束任務(含轉換)。

輔助類 `Assignee` 記錄 `userID`、`startDate`、`endDate`,實作 `Serializable`。

3. Hibernate 映射與工廠

`AssignableTaskInstance` 映射:`subclass` 延伸 `TaskInstance`,`discriminator-value="A"`,`assignees` 列表一對多關聯 `Assignee`。
`Assignee` 映射:表 `JBPM_ASSIGNEE`,欄位 `STARTDATE_`、`USERID_`、`ENDDATE_`。
工廠類 `AssignableTaskInstanceFactory` 實作 `TaskInstanceFactory` 回傳新實例。
jBPM 配置檔註冊工廠:

<bean name="jbpm.task.instance.factory" class="com.navteq.jbpm.extensions.AssignableTaskInstanceFactory" singleton="true"/>

4. 使用範例

List actorIds = new LinkedList<>(); actorIds.add("Peter");
List cTasks = jbpmContext.getGroupTaskList(actorIds);
AssignableTaskInstance aTask = (AssignableTaskInstance)cTasks.get(0);
try { aTask.reserve("Peter"); jbpmContext.close(); } catch(Exception e) { ... }

實現任命

jBPM API 直接支援:從組任務列表移至個人列表。關鍵:清空參與者池需用接收 `Set` 的 API 傳入 `null`。

List actorIds = new LinkedList<>(); actorIds.add("admins");
List cTasks = jbpmContext.getGroupTaskList(actorIds);
TaskInstance cTask = cTasks.get(0);
cTask.setPooledActors((Set)null);
cTask.setActorId("admin");

實現升級

重新分派式升級

結合 jBPM 計時器與重新分派機制,涉及三個處理器:

  1. 指派處理器 (`EscalationAssignmentHandler`):讀取流程變數 `taskName + "escLevel"`,首次指派 `admin`,升級後指派 `bob`。可換任意策略。
  2. 任務建立處理器 (`TaskCreationActionHandler`):事件 `task-create` 觸發,保存任務實例 ID 至流程變數 `taskName + "instance"`。
  3. 超時處理器 (`EscalationActionHandler`):計時器觸發,遞增 `escLevel`,取得任務實例 ID,呼叫 `current.end(escalation)` 完成任務並觸發轉換(通常回任務節點重新指派)。

流程定義片段:

<task-node name="customTask">
  <task name="task2">
    <assignment class="com.sample.action.EscalationAssignmentHandler"/>
  </task>
  <event type="task-create">
    <action class="com.sample.action.TaskCreationActionHandler"/>
  </event>
  <timer duedate="10 second">
    <action class="com.sample.action.EscalationActionHandler">
      <escalation>escalation</escalation>
    </action>
  </timer>
  <transition to="end" name="to end"/>
  <transition to="customTask" name="escalation"/>
</task-node>

通知式升級

jBPM 內建郵件支援極強,計時器觸發郵件動作發送通知,實現極簡單。

實現鏈式執行

直接由 jBPM 泳道 支援,無需額外開發。首任務指派泳道後,同泳道後續任務自動由同一參與者完成。

總結

儘管自動化程度提高,複雜業務流程仍難免人工介入。本文展示四大高級人工交互模式,證明 jBPM 擴展 API 輕鬆實現,避免複雜建模陷阱,賦予流程系統處理人工協作的強大靈活性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved