fork:
有一个分支到达流程就可以继续执行的效果了,如下:
- import org.jbpm.graph.def.ActionHandler;
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.graph.node.Join;
- public class JoinAction implements ActionHandler {
- public void execute(ExecutionContext arg0) throws Exception {
- Join join=(Join)arg0.getNode();
- join.setDiscriminator(true);
- }
- }
decision:
一个decision用以决定在多个执行路径中哪个才可以被执行。如果你是一个程序员,把它可以理解成switch case结构即可,一个decision能够具有许多离开的transition。Handler所指定的DecisionHandler的实现类里的decide方法返回一个字符串,表示要执行哪个transition,如下例:
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.graph.node.DecisionHandler;
- public class ForkDecision implements DecisionHandler {
- public String decide(ExecutionContext arg0) throws Exception {
- String dayCount = (String) arg0.getVariable("dayCount");
- String go = "to boss approve";
- if (Integer.parseInt(dayCount) > 10) {
- go = "to join";
- }
- return go;
- }
- }
event:
JBPM定义了一系列与工作流节点元素相关联的事件,例如,流程实例运行过程中,可以触发节点进入(node-enter)、节点离开 (node-leave)、流程启动(process-start)、流程结束(process-end)、任务创建(task-create)、 任务分派(task-assign)、任务启动(task-start)等事件。
个人理解,event为action服务,在action外面包一层,使action更加灵活。
timer:
定时器timer可以被用于decision fork join node process-state state super-state task-node,可以设置开始时间duedate和频率repeat,定时器动作可以是所支持的任何动作元素,如action或script。
timer 还有一个很重要的属性cancel-event,这个是timer和task结合时使用的,任务定时器的cancel-event可以被定制。默认情况 下,当任务被结束时(=完成)任务上的定时器将被取消,这是通过在定时器上使用cancel-event属性,流程开发者可以定制诸如task- assign或task-start。cancel-event支持多个事件,通过在属性中指定一个用逗号分割的列表,可以组合cancel-event 的类型。
Task:
Task 是是流程定义里的一部分,它决定了task instance的创建和分配。
swimlane:
实际应用中,一个人是一个流程中多个Task的参与者(actor)的情况是很常见的。在jbpm中通过创建一个swimlane并且把swimlane赋给一个task的方式来设置当前task的参与者(actor)。一个业务流程中的swimlane可以被看做为一个参与者的参与者对象的名称,当然它不一定是固定的某个人,它可以是一个用户组,一个特定用户的角色等。首次执行到达一个Task,赋给该Task的一个swimlane就会算出参与者(actor)。
controller(控制器):
在任务执行时,可能需要读、写流程变量;在任务完成并提交时,可能需要写流程变量。为此,jBPM提供了"任务变量"的概念。在某些情况下,任务变量和流 程变量并非简单的一一对应关系,例如,三个流程变量代表三个月的销售额,任务变量只需要它们的平均值。为实现任务与流程实例之间的信息交流,jBPM设置 了任务控制器机制。该机制也采用递进模式:首先,jBPM提供基本(默认)的任务控制器;如果不敷使用,二次开发人员可以使用自定义的任务控制器。 jBPM的任务控制器机制在流程变量和任务变量之间架起了一座桥梁。
例子:
- <?xml version="1.0" encoding="UTF-8"?>
- <process-definition xmlns="" name="test">
- <!--定义一个开始结点,名为start,指向fork1-->
- <start-state name="start">
- <transition name="" to="fork1"></transition>
- </start-state>
- <!--在fork1分支结点上,我们定义了两个走向(transition)tr1和tr2,其中tr1指向top-state节点,tr2指向一个process-state,当token到达for1时会自动形成两个child token,沿着tr1和tr2的指向继续向执行-->
- <fork name="fork1">
- <transition name="tr1" to="top-state"></transition>
- <transition name="tr2" to="test-sub-process"></transition>
- </fork>
- <!--top-state是一个state类型的节点,也就是前面提到的手工节点-->
- <state name="top-state">
- <transition name="to test-task" to="test-task"></transition>
- </state>
- <!--test-task是一个task-node类型的节点,它可以有多个task节点,生成我们的taskInstance,这里我们定义了三个节点-->
- <task-node name="test-task" signal="first">
- <task name="task-a"></task>
- <task name="task-b"></task>
- <task name="task-c"></task>
- <transition name="to buttom-node" to="buttom-node"></transition>
- </task-node>
- <!-- buttom-node 是一个node节点,可以自动执行,不用人工干预处理-->
- <node name="buttom-node">
- <transition name="" to="join1"></transition>
- </node>
- <!-- 在test-sub-process里我们加上了一个子流程处理,子流程定义我们写在了里面定义的enter-sub-process-action 里-->
- <process-state name="test-sub-process">
- <event type="node-enter">
- <action name="enter-sub-process-action"
- class="gaojie.process.action.EnterSubProcessAction">
- </action>
- </event>
- <transition name="" to="join1"></transition>
- </process-state>
- <!--join1是一个join节点,与fork节点对应,从fork分支出发的所有child token汇集到join后继续向下执行-->
- <join name="join1">
- <transition name="" to="end"></transition>
- </join>
- <!--最后是结束结点,流程执行到此就宣告结束了-->
- <end-state name="end"></end-state>
- </process-definition>