通用業務流程常涉及人工參與,從簡單人工核准到複雜資料輸入,引入人工交互模式:
遵循 jBPM 最佳實踐「擴展 API 而非複雜建模」,採用任務內解決方案,修改 `Task`、`TaskInstance` 類別。
新增 `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>
自定 `AssignableTaskInstance` 繼承 `TaskInstance`,追蹤指派參與者並確保全數完成。核心邏輯:
輔助類 `Assignee` 記錄 `userID`、`startDate`、`endDate`,實作 `Serializable`。
`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"/>
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 計時器與重新分派機制,涉及三個處理器:
流程定義片段:
<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 輕鬆實現,避免複雜建模陷阱,賦予流程系統處理人工協作的強大靈活性。