Task management 任務(wù)管理
The core business of jBPM is the ability to persist the execution of a process. A situation in which this feature is extremely useful is the management of tasks and tasklists for people. jBPM allows to specify a piece of software describing an overall process which can have wait states for human tasks.
jBPM的核心邏輯是有能力持久化流程的執(zhí)行。一個為人們用來管理任務(wù)和任務(wù)列表的特征的情形是非常有用的。jBPM允許指定一些軟件描述一個全面的流程,它可以為人任務(wù)擁有等待狀態(tài)。
9.1. Tasks 任務(wù)
Tasks are part of the process definition and they define how task instances must be created and assigned during process executions.
任務(wù)是流程定義的一部分,并且他們定義了任務(wù)實(shí)例如何在流程執(zhí)行中必須被創(chuàng)建并且委派。
Tasks can be defined in task-nodes and in the process-definition. The most common way is to define one or more tasks in a task-node. In that case the task-node represents a task to be done by the user and the process execution should wait until the actor completes the task. When the actor completes the task, process execution should continue. When more tasks are specified in a task-node, the default behaviour is to wait for all the tasks to complete.
任務(wù)可以在task-nodes和process-definition中被定義。最常用的方式是在task-node中定義一個或多個任務(wù)。如果是那樣的話,task-node表現(xiàn)一個任務(wù)被用戶執(zhí)行并且流程執(zhí)行應(yīng)該等待知道actor完成這個任務(wù)。當(dāng)這個actor完成這個任務(wù),流程定義應(yīng)該繼續(xù)。當(dāng)更多任務(wù)在task-node被定義,缺省的行為是等待所有任務(wù)的完成。
Tasks can also be specified on the process-definition. Tasks specified on the process definition can be looked up by name and referenced from within task-nodes or used from inside actions. In fact, all tasks (also in task-nodes) that are given a name can be looked up by name in the process-definition.
任務(wù)也被定義在process-definition中。指定在流程定義上的任務(wù)可以通過名稱查詢并且參考從內(nèi)部的task-nodes或者從內(nèi)部actions中使用。事實(shí)上,所有的給定名稱任務(wù)(也在task-nodes)可以在流程定義中通過名字查詢。
Task names must be unique in the whole process definition. Tasks can be given a priority. This priority will be used as the initial priority for each task instance that is created for this task. TaskInstances can change this initial priority afterwards.
任務(wù)名稱在整個流程定義中是非重復(fù)。任務(wù)可以被指定一個優(yōu)先權(quán)。這個優(yōu)先權(quán)將被使用在初始化優(yōu)先權(quán)為每個為任務(wù)創(chuàng)建的流程實(shí)例。任務(wù)實(shí)例然后可以修改初始化優(yōu)先權(quán)
9.2. Task instances
A task instance can be assigned to an actorId (java.lang.String). All task instances are stored in one table of the database (JBPM_TASKINSTANCE). By querying this table for all task instances for a given actorId, you get the task list for that perticular user.
一個任務(wù)實(shí)例可以被委派給一個actorId(java.lang.String).所有任務(wù)實(shí)例被儲存在數(shù)據(jù)庫的一個表中(JBPM_TASKINGSTANCE)。通過給定的actorId來對所有的任務(wù)實(shí)例查詢這個表,你為特定用戶得到任務(wù)列表。
The jBPM task list mechanism can combine jBPM tasks with other tasks, even when those tasks are unrelated to a process execution. That way jBPM developers can easily combine jBPM-process-tasks with tasks of other applications in one centralized task-list-repository.
這個jBPM任務(wù)列表機(jī)制可以組合jBPM任務(wù)和其他任務(wù),甚至當(dāng)這些任務(wù)于流程執(zhí)行無關(guān)。那種方法jBPM開發(fā)者可以很容易的在一個集中的任務(wù)列表倉庫中組合jBPM流程任務(wù)和其他應(yīng)用程序。
9.2.1. Task instance life cycle
The task instance lifecycle is straightforward: After creation, task instances can optionally be started. Then, task instances can be ended, which means that the task instance is marked as completed.
任務(wù)實(shí)例生命周期是簡單的:創(chuàng)建之后,任務(wù)實(shí)例可以隨意地開始。接著,任務(wù)實(shí)例可以被終結(jié),這意味著任務(wù)實(shí)例內(nèi)標(biāo)志為完成。
Note that for flexibility, assignment is not part of the life cycle. So task instances can be assigned or not assigned. Task instance assignment does not have an influence on the task instance life cycle.
注意對適應(yīng)性、委派不是生命周期的組成部分。所以任務(wù)實(shí)例可以被委派或者不委派。任務(wù)實(shí)例委派在生命周期任務(wù)實(shí)例中沒有影響。
Task instances are typically created by the process execution entering a task-node (with the method TaskMgmtInstance.createTaskInstance(...)). Then, a user interface component will query the database for the tasklists using the TaskMgmtSession.findTaskInstancesByActorId(...). Then, after collecting input from the user, the UI component calls TaskInstance.assign(String), TaskInstance.start() or TaskInstance.end(...).
TaskMgmtInstance.createTaskInstance(...)
TaskMgmtSession.findTaskInstancesByActorId(...)
TaskInstance.assign(String)
TaskInstance.start()
TaskInstance.end()
A task instance maintains it's state by means of date-properties : create, start and end. Those properties can be accessed by their respective getters on the TaskInstance.
一個任務(wù)實(shí)例維護(hù)它的狀態(tài)借助于日期屬性:create,start 和end. 這些屬性可以在任務(wù)實(shí)例中通過他們分別的getter獲得通道。
Currently, completed task instances are marked with an end date so that they are not fetched with subsequent(隨后) queries for tasks lists. But they remain in the JBPM_TASKINSTANCE table. JBPM_TASKINSTANCE.
9.2.2. Task instances and graph execution 任務(wù)實(shí)例和圖形執(zhí)行
Task instances are the items in an actor's tasklist. Task instances can be signalling. A signalling task instance is a task instance that, when completed, can send a signal to its token to continue the process execution. Task instances can be blocking, meaning that the related token (=path of execution) is not allowed to leave the task-node before the task instance is completed. By default task instances are signalling and non-blocking.
In case(以防) more than one task instance are associated with a task-node, the process developer can specify how completion of the task instances affects continuation of the process. Following is the list of values that can be given to the signal-property of a task-node.
last: This is the default. Proceeds execution when the last task instance is completed. When no tasks are created on entrance of this node, execution is continued.
last-wait: Proceeds execution when the last task instance is completed. When no tasks are created on entrance of this node, execution waits in the task node till tasks are created.
first: Proceeds execution when the first task instance is completed. When no tasks are created on entrance of this node, execution is continued.
first-wait: Proceeds execution when the first task instance is completed. When no tasks are created on entrance of this node, execution waits in the task node till tasks are created.
unsynchronized: Execution always continues, regardless wether tasks are created or still unfinished.
never: Execution never continues, regardless wether tasks are created or still unfinished.
Task instance creation might be based upon a runtime calculation. In that case, add an ActionHandler on the node-enter event of the task-node and set the attribute create-tasks="false". Here is an example of such an action handler implementation:
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");
// now, 2 task instances are created for the same task.
tmi.createTaskInstance(changeNappy, token);
tmi.createTaskInstance(changeNappy, token);
}
}
As shown in the example the tasks to be created can be specified in the task-node. They could also be specified in the process-definition and fetched from the TaskMgmtDefinition. TaskMgmtDefinition extends the ProcessDefinition with task management information.
The API method for marking task instances as completed is TaskInstance.end(). Optionally, you can specify a transition in the end method. In case the completion of this task instance triggers continuation of the execution, the task-node is left over(延遲) the specified transition.