JBPM流程通過Aciton動態創建TaskInstance來實現“會籤”

昨天在Jbpm-inside羣裏面和大家討論了在Jbpm流程中,如何實現“會籤”的問題,最後得出了兩種方案。今天就這兩種思想中的一種:通過Aciton動態創建TaskInstance來實現“會籤”,自己實現了一把,成功了!

1. 創建processDefinition.xml流程定義文件,如下:

[code]
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay">
<swimlane name="PooledActors">
<assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment>
</swimlane>
<start-state name="網上支付審批流程">
<transition name="開始" to="財務人員錄入"></transition>
</start-state>
<task-node name="財務人員錄入">
<task name="財務人員錄入申報數據" swimlane="PooledActors"></task>
<transition name="主管會計複覈" to="主管會計複覈"></transition>
</task-node>
<task-node name="主管會計複覈" signal="last-wait" create-tasks="false">
<task name="主管會計複覈" swimlane="PooledActors"></task>
<event type="node-enter">
<action name="createInstance"
class="com.sky.plugin.jbpm.CreateTaskInstance">
</action>
</event>
<transition name="複覈通過" to="領導審批"></transition>
<transition name="複覈不通過" to="異常結束"></transition>
</task-node>
<task-node name="領導審批">
<task name="領導審批" swimlane="PooledActors"></task>
<transition name="同意" to="結束"></transition>
<transition name="不同意" to="異常結束"></transition>
</task-node>
<end-state name="結束"></end-state>
<end-state name="異常結束"></end-state>
</process-definition>
[/code]

task-node"主管會計複覈"則是我們需要進行會籤的節點。在這個節點我們設置了幾個重要的屬性:

[list] 1) signal="last-wait",這個屬性決定了該節點將在完成該節點內的所有Task的TaskInstance以後纔會進入下一個節點。)[/list]
[list] 2) create-tasks="false",這個屬性決定了在進入該節點的時候,不會自動爲該節點的任何Task創建任何的TaskInstance。因爲我們需要根據會籤的人員來自己創建TaskInstance。[/list]
[list] 3) action,action的設定是爲了,在Action中根據實際的情況來創建TaskInstance[/list]


2. 編寫Action代碼

[code]
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.graph.node.TaskNode;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;

public class CreateTaskInstance implements ActionHandler {

private static final long serialVersionUID = 1L;

public void execute(ExecutionContext executionContext) throws Exception {
Token token = executionContext.getToken();
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();

TaskNode taskNode = (TaskNode) executionContext.getNode();
Task task= taskNode.getTask("主管會計複覈");
tmi.createTaskInstance(task, token)
.setPooledActors(new String[]{"1000"});
tmi.createTaskInstance(task, token)
.setPooledActors(new String[]{"1001"});

}

}
[/code]

當然,在實際情況中.setPooledActors(new String[]{"100"})中設置的actor應該是動態指定的,這裏爲了簡單方便就直接寫入的固定值。

3.部署運行,OK!

注意:如果在給TaskInstance指定Actor的時候是使用.setActor()方法的話,那麼在獲取用戶任務列表的時候用.findTaskInstances();如果是用.setPooledActors(),則需要使用.findPolledTaskInstance()方法。[list][/list]
發佈了5 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章