同fork等一樣是一種節點類型。任務節點是jbpm
中一個非常重要的概念,一個任務節點可以包含若干個任務(開始狀態start-state只能有一個任務),不同的任務可以由不同的人來完成,任務實例被分配給actorId來完成。
任務實例有幾個狀態:創建、開始、結束,這些信息存在JBPM
_TASKINSTANCE中。
常用的方法:
分派任務(指定處理人)-TaskInstance.assign(String)
根據處理人查找任務實例-TaskMgmtSession.findTaskInstancesByActorId(…)
任務創建-TaskMgmtInstance.createTaskInstance(…)
任務開始-TaskInstance.start()
任務結束TaskInstance.end(…)
任務可以被指定一個優先級,這個優先級在任務的實例創建時將被作爲每個任務實例的初始優先級,任務實例的初始優先級可以在以後被修改。
如果多於一個任務實例與一個任務節點關聯,流程開發者可以指定任務實例的完成怎樣影響流程的繼續。下面是可以給任務節點的signal屬性設置的值:
l last:這是默認值。當最後一個任務實例完成時繼續執行;當在節點入口處沒有任務創建時,繼續執行。
l last-wait:當最後一個任務實例完成時繼續執行;當在節點入口處沒有任務創建時,執行在任務節點等待,直到任務被創建。
l first:當第一個任務實例完成時繼續執行;當在節點入口處沒有任務創建時,繼續執行。
l first-wait:當第一個任務實例完成時繼續執行;當在節點入口處沒有任務創建時,執行在任務節點等待,直到任務被創建。
l unsynchronized:總是繼續執行,不管任務是否創建和完成。
l never:執行不再繼續,不管任務是否創建和完成。
你可以在流程定義文件中定義任務,也可以在代碼中定義:
public class CreateTasks implements ActionHandler {
public void execute(ExecutionContext executionContext) throws Exception {
Token token = executionContext.getToken();
TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskNode taskNode = (TaskNode) executionContext.getNode();
Task changeNappy = taskNode.getTask("change nappy");
// 現在, 相同任務的兩個任務實例被創建
tmi.createTaskInstance(changeNappy, token);
tmi.createTaskInstance(changeNappy, token);
}
}
在Jbpm
中,可以結合使用推模式和拉模式的任務分配。流程可以計算任務的責任人,並把它推到他/她的任務清單裏;或者,任務可以被分配到參與者池,這種情況下,池中的每個參與者都可以拉出任務並把它放入參與者的個人任務清單。
推模式:Assignable.setActorId(String actorId);TaskMgmtSession.findTaskInstances(String actorId)
拉
模式:Assignable.setPooledActors(String[]
actorIds);TaskMgmtSesion.findPooledTaskInstances(String
actorId);TaskMgmtSession.findPooledTaskInstances(List actorIds)
爲了防止多個用戶在同一個共享任務上工作,使用用戶的actorId修改任務實例的actorId就可以了。這樣,任務實例將不會出現在共享任務清單中,而只會存在於用戶個人的任務清單裏。設置任務實例的actorId爲空(null),則會把任務實例放回共享任務裏。
任務實例可以擁有它自己的變量,並且也可以“看到”流程變量。
<task name="clean ceiling">
<controller>
<variable name="a" access="read" mapped-name="x" />
<variable name="b" access="read,write,required" mapped-name="y" />
<variable name="c" access="read,write" />
</controller>
</task>
這裏使用的是默認的控制器,也可以定義自己的控制器
<task name="clean ceiling">
<controller class="com.yourcom.CleanCeilingTaskControllerHandler">
-- here goes your task controller handler configuration --
</controller>
</task>
任務有四個標準的事件類型定義:task-create,task-assign,task-start,和task-end。
< process-definition xmlns ="" name ="yytest" >
< swimlane name ="banker" >
< assignment expression ="user(ernie)" />
</ swimlane >
< swimlane name ="casher" >
< assignment expression ="user(bert)" />
</ swimlane >
< start-state name ="start" >
< transition name ="" to ="charge" />
</ start-state >
< task-node name ="charge" signal ="first" >
< task name ="bank" swimlane ="banker" />
< task name ="cash" swimlane ="casher" />
< transition name ="" to ="end" />
</ task-node >
< end-state name ="end" />
</ process-definition >
Jbpm Context jbpm Context = jbpm Configuration.createJbpm Context();
try {
long processInstanceId = 1 ;
processInstance = jbpm Context.loadProcessInstance(processInstanceId);
Token token = processInstance.getRootToken();
System.out.println(token.getNode());
token.signal();
System.out.println(token.getNode());
List casherTasks = jbpm Context.getTaskMgmtSession().findTaskInstances( " ernie " );
TaskInstance cashertaskInstance = (TaskInstance)casherTasks.get( 0 );
cashertaskInstance.start();
cashertaskInstance.end();
System.out.println(token.getNode());
jbpm Context.save(processInstance);
} finally {
jbpm Context.close();
}
}
-------------------------------------------------
輸出結果
StartState(start)
TaskNode(charge)
EndState(end)