文章來源:matinnn的博客http://blog.csdn.net/matinnn
1 swimlane:
具有流程角色的意思。一種多個任務由同一個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。
2 assignment:
用於任務分派的元素。
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。
3 expression:
分派表達式。
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}" 。
4 delegation:
用來在流程執行過程中運行用戶自定義代碼的機制。可用於任務代理。
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配置信息。
5 start-state:
特殊node:啓動節點。可以包含task、transition、event和exception-handler。
6 transition:
源節點是包含該transition的節點,目標節點由to指出。transition的名字是可選的。jBPM的路由功能依賴於transition名字的唯一性。但如果多個transition有相同的名字,將選擇第一個。節點transition list中的第一個是其default transition。
7 task:
任務定義,指出如何創建和分派任務實例。可以在task-node,也可以在process-definition中定義。process-definition範圍內task name必須唯一。
任務可以指定優先級。任務實例可以修改此優先級。
該任務可以屬於一個swimlane,此時它的分派由對應的swimlane執行。
duedate指出任務的超時日期。
task的signalling屬性指出當該任務實例完成時,可以發送一個signal給其token來繼續流程的執行。task的blocking屬性指出當該任務實例沒完成之前,與之相關的token不能離開該task-node。默認設置是signalling和non-blocking。
8 task-controller:
可選。
任務創建時,可以用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