文章来源:matinnn的博客http://blog.csdn.net/matinnn
具有流程角色的意思。一种多个任务由同一个actor执行的机制。swimlane中的第一个任务实例创建后分派时,会为该swimlane记住actor,后续的任务分派时将使用该actor。swimlane中的任务不能指定assignment,swimlane中的任务实例分派时,将由swimlane指定的assignment进行分派。swimlane中的第一个任务实例创建时,调用AssignmentHandler,此时传给AssignmentHandler的Assignable是一个SwimlaneInstance。
public interface AssignmentHandler extends Serializable {
void assign( Assignable assignable, ExecutionContext executionContext );
}
public interface Assignable {
public void setActorId(String actorId);
public void setPooledActors(String[] pooledActors);
}
TaskInstance和SwimlaneInstance都实现了Assignable。
用于任务分派的元素。
actor-id:执行该任务的actor。
pooled-actors:可以执行该任务的actors。
两种分派模型:push和pull。
push:流程执行分派,调用Assignable.setActorId决定将该任务push到哪个user的任务列表。任务列表的获取:TaskMgmtSession.findTaskInstances(String actorId).
pull:该任务具有多个候选actor。由pool中的actor将任务pull进自己的任务列表。在pull之前任务对pool中的所有actor可见,pull后,actor-id变为pull的actor,并在pool中不可见。将actor-id置为null可以将该任务实例重新放回poll。调用Assignable.setPooledActors分派给pooledActors。
分派表达式。
identity comoponent:用户、组和许可权的管理,包括组织模型信息。
分派表达式示例:
<process-definition>
...
<task-node name='a'>
<task name='laundry'>
<assignment expression='previous --> group(hierarchy) --> member(boss)' />
</task>
<transition to='b' />
</task-node>
...
分派表达式语法:
first-term --> next-term --> next-term --> ... --> next-term
其中:
first-term ::= previous |
swimlane(swimlane-name) |
variable(variable-name) |
user(user-name) |
group(group-name)
next-term ::= group(group-type) |
member(role-name)
还可在action、delegation、decision condition中使用类似于JSP/JSF EL的表达式语言,如expression="#{myVar.handler[assignments].assign}" 。
用来在流程执行过程中运行用户自定义代码的机制。可用于任务代理。
class(必需):完整类名。
config-type(可选):指定如何实例化和配置delegation对象。若没有则用默认constructor,并忽略配置信息。
field:configuration中的elementnames对应delegation中的域名;
示例:
public class MyAction implements ActionHandler {
// access specifiers can be private, default, protected or public
private String city;
Integer rounds;
...
}
对应的配置文件:
...
<action class="org.test.MyAction">
<city>Atlanta</city>
<rounds>5</rounds>
</action>
...
bean;constructor;configuration-property。
configuration(可选):xml文件,delegation配置信息。
特殊node:启动节点。可以包含task、transition、event和exception-handler。
源节点是包含该transition的节点,目标节点由to指出。transition的名字是可选的。jBPM的路由功能依赖于transition名字的唯一性。但如果多个transition有相同的名字,将选择第一个。节点transition list中的第一个是其default transition。
任务定义,指出如何创建和分派任务实例。可以在task-node,也可以在process-definition中定义。process-definition范围内task name必须唯一。
任务可以指定优先级。任务实例可以修改此优先级。
该任务可以属于一个swimlane,此时它的分派由对应的swimlane执行。
duedate指出任务的超时日期。
task的signalling属性指出当该任务实例完成时,可以发送一个signal给其token来继续流程的执行。task的blocking属性指出当该任务实例没完成之前,与之相关的token不能离开该task-node。默认设置是signalling和non-blocking。
可选。
任务创建时,可以用controller来移植任务实例变量;任务实例完成时,可以通过controller来向流程实例变量提交任务实例变量。
并不强迫一定要使用controller,仅当有下列需求时使用controller:
1) 创建流程实例变量在任务实例中的副本,使得对任务实例变量的改变不会影响流程实例变量。直到流程完成再将任务实例变量提交。
2) 流程实例变量与任务实例变量不是一一对应关系。例如三个流程变量“sales in january”、“sales in februry”和“sales in march”,在任务中可能需要用到的是这三个变量的平均值。
controller在流程变量(process context)和用户接口应用程序之间起一个桥的作用(如下图所示)。当创建任务实例时,controller负责从流程变量中摘录信息来创建任务变量。这些变量作为用户输入提供给用户接口应用。外部输入也存储在任务变量中。当任务结束时,controller负责用任务实例数据更新流程变量。
简单的一对一映射的例子如下:
<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>
name属性指流程变量名,mapped-name指任务中的变量名。access属性指出是否在任务创建时复制变量,或是否在任务结束后写回流程,或是否是必须的。access是可选的,默认值是"read,write"。
如果简单的一一映射不能满足需要,可以自定义TaskControllerHandler接口的实现:
public interface TaskControllerHandler extends Serializable {
void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
void submi