一个JPDL文件中一般有以下标签:
- 1,start
- 2,state
- 3,end
- 4,task
- 5,sub-process
- 6,customer
- 7,decision
- 8,fork-join
第一个:start,end, 一个是入口,一个是出口
<start> <transition to="a" /> </start> ..... <end name="z" />
第二个:state(一个阻塞的阶段)
(1)
<state name="a"> <transition to="b" /> </state>
如果我们想知道流程实例在那个状态的话,
Execution executionInA = processInstance.findActiveExecutionIn("a");
如果不为空的话就是处于这个阶段;
在业务都处理了,就要让流程继续了,
executionService.signalExecutionById(executionInA.getId());
(2)
<state name="a"> <transition name="a1" to="b" /> <transition name="a2" to="c" /> </state> <state name="b" /> <state name="c" />
如果有多分支的话,就要传人变量进行选择
processInstance = executionService.signalExecutionById(executionInA.getId(),"a2");
判断是否处于指定的流程:
processInstance.isActive("b");
第三个,decision(根据最先匹配的一个条件自动流出)
(1)
<decision expr="#{content}" name="d"> <transition name="e" to="e1"> <transition name="f" to="e2"> <transition name="g" to="e3"> </decision>
只要搞定表达式就可以了:
Map<String,Object> map= new HashMap<String, Object>(); map.put("content","f"); executionService.startProcessInstanceByKey("流程名",map);
这样就流到f分支了
(2)
<decision name="d"> <handler class="com.handler.Content" /> <transition name="e" to="e1"> <transition name="f" to="e2"> <transition name="g" to="e3"> </decision>
Content类的实现
public class Content implements DecisionHandler{ public String decide(OpenExecution execution){ String content = (String) execution.getVariable("content"); if (content.equals("good")){ return "e"; } if (content.equals("bad")){ return "f"; } return "g"; } }
我们要传值,让流程通向f:
Map<String,Object> map= new HashMap<String, Object>(); map.put("content","bad"); executionService.startProcessInstanceByKey("流程名",map);
比较:state与decision很相似,只是当没有条件满足时,state是默认第一分支流出,而decision呢就是直接报错了。
第四个,fork-join
<fork name="fork"> <transition name="e" to="e1"> <transition name="f" to="e2"> <transition name="g" to="e3"> </fork> <state name="e1"> <transition to="one join" /> </state> <state name="e2"> <transition to="one join" /> </state> <state name="e3"> <transition to="final join" /> </state> <join name="one join"> <transition to="another state" /> </join> <state name="another state"> <transition to="final join" /> </state> <join name="final join"> <transition to="end" /> </join> <end name="end" />
在执行fork流程后,会有三个活动状态
processInstance.findActiveExcutionIn("e1"); processInstance.findActiveExcutionIn("e2"); processInstance.findActiveExcutionIn("e3");
join标签的两个属性是multiplicity,lockmode,一个是那个可以指定那个multiplicity的数量就是满足条件聚合了,lockmode是为了指定Hibernate的数据锁模式,防止死锁。
第五个,task,人工任务
<task name="review" assignee="#{order.owner}" > <transition to="wait" /> </task>
public class Order implements Serializable { String owner; public Order(String owner){ this.owner = owner ; } public String getOwner(){ return owner; } public void setOwner(String owner){ this.owner = owner; } }
order 对象的传入
Map<String,Object> map= new HashMap<String, Object>(); map.put("order",new Order("tom")); executionService.startProcessInstanceByKey("流程名",map);
也可以直接 assigned="tom"
tom所拥有的任务列表是:
List<Task> taskList = taskService.findPersonalTasks("tom");
task标签的candidate-groups和candidate-users可以指定多个用户组或用户;
<task name="review" assignee="group" > <transition to="wait" /> </task>
身份认证服务:identityService是用来建立成员与组的关系的
建组group:
identityService.createGroup("group");
建用户tom:
identityService.createUser("tom","tom","alex","jerry");
建立用户关系:
identityService.createMembership("tom","group");
查找tom的任务列表:
taskService.findGroupTasks("tom");
tom接受了任务:
taskService.takeTask(task.getId(),"tom");
获得任务变量集:
Set<String> variableNames = taskService.getVariableNames(taskId); Map<String,Object> variables = taskService.getVariables(taskId,variableNames);
将任务变量设置到任务中:
taskService.setVariables(taskId, variables);
如果有同名的变量的话会覆盖原来?
用处理器分配任务:
<task name=""> <assignment-handler class="com.MyHandler"> <field name="assignee" > <string value="tom" /> </field> </assignment-handler> <transition to="wait" /> </task>
com.MyHandler的实现:
public class MyHandler implements AssignmentHandler { //这个assignee已经在JPDL中注入了 String assignee; public void assign(Assignable assignable , OpenExecution execution){ assignable.setAssignee(assignee); } }
任务分配中的泳道:
一个泳道属于一个人的,等于把泳道内的任务分配给一个人:
<swimlane name="swimlane is here" candidate-groups="group" /> <start> <transition to="into task" /> </start> <task name="into task" swimlane="swimlane is here" > <transition to="next task" /> </task> <task name="next task" swimlane="swimlane is here" > </task>
如果group 用户组中的 tom用户接受了任务的话 , 就会在这个流程实例中 被固化成分配者。
tom接受任务:
taskService.takeTask(taskId, "tom"); taskService.completeTask(taskId);