一个流E定义有一个TaskMgmtDefinitionQ一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以 TaskMgmtDefinition中通过task的名U直接获取相应的task;
swimlane对象有四个属性,分别是nameQ名字)、assignmentDelegationQ分配代理类Q、taskMgmtDefinition、tasksQSet 对应多个task),可以增加task
task对象主要的属性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNodeQ需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有|因ؓ它们都和d的分配有关系?/P>
一个流E实例有一个TaskMgmtInstanceQ一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;
swimlaneInstance对象主要有五个属性,分别是name、actorId、pooledActorsQSetQ、swimlane、taskMgmtInstance?BR>taskInstance对象的主要属性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors?/P>
当对dq行分配Ӟ一般需要实现AssignmentHandlerq个接口Q这个接口的Ҏ(gu)只有一个:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一个典型的实现Q把名字?change nappy'的Q务交lNappyAssignmentHandlerq个cL分配Q?BR> <task name='change nappy'>
<assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />
</task>
NappyAssignmentHandlerc:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同样QAssignable只是一个接口,它有两个Ҏ(gu)QsetActorId()和setPooledActors()QAssignable的具体实现类也是两个
swimlaneInstancehe和taskInstance。这样就不不隄解整个Q务分配流E了Q?BR> 1、流E进入TaskNode节点Q执行TaskNodecȝexecute()Ҏ(gu)Q该Ҏ(gu)首先获得TaskMgmtInstance实例Q然后通过它来创徏TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,该方法调用了taskInstance.assign(executionContext)对taskInstanceq行分配?BR> 3、在assign(executionContext)Ҏ(gu)里,首先会判断task属性里是否存在swimlaneQ如果有的话Q这个taskInstance׃分配lswimlane指定的ActorId?PooledActorsQ如果不存在Q再Ltask属性里 assignmentDelegationQ分配代理类Q通过代理c(x们自己写的实现AssignmentHandlerq个接口的类Q指定ActorId?PooledActors?