jBPM建模語言jpdl分析

文章來源:matinnn的博客http://blog.csdn.net/matinnn

1             swimlane

具有流程角色的意思。一種多個任務由同一個actor執行的機制。swimlane中的第一個任務實例創建後分派時,會爲該swimlane記住actor,後續的任務分派時將使用該actorswimlane中的任務不能指定assignmentswimlane中的任務實例分派時,將由swimlane指定的assignment進行分派。swimlane中的第一個任務實例創建時,調用AssignmentHandler,此時傳給AssignmentHandlerAssignable是一個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);

}

TaskInstanceSwimlaneInstance都實現了Assignable

 

 

2             assignment

用於任務分派的元素。

actor-id:執行該任務的actor

pooled-actors:可以執行該任務的actors

兩種分派模型:pushpull

push:流程執行分派,調用Assignable.setActorId決定將該任務push到哪個user的任務列表。任務列表的獲取:TaskMgmtSession.findTaskInstances(String actorId).

pull:該任務具有多個候選actor。由pool中的actor將任務pull進自己的任務列表。在pull之前任務對pool中的所有actor可見,pull後,actor-id變爲pullactor,並在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)

 

還可在actiondelegationdecision condition中使用類似於JSP/JSF EL的表達式語言,如expression="#{myVar.handler[assignments].assign}"

 

 

4             delegation

用來在流程執行過程中運行用戶自定義代碼的機制。可用於任務代理。

class(必需):完整類名。

config-type(可選):指定如何實例化和配置delegation對象。若沒有則用默認constructor,並忽略配置信息。

fieldconfiguration中的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>

...

 

beanconstructorconfiguration-property

configuration(可選):xml文件,delegation配置信息。

 

 

5             start-state

特殊node:啓動節點。可以包含tasktransitioneventexception-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指出任務的超時日期。

tasksignalling屬性指出當該任務實例完成時,可以發送一個signal給其token來繼續流程的執行。taskblocking屬性指出當該任務實例沒完成之前,與之相關的token不能離開該task-node。默認設置是signallingnon-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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章