首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

开始jbpm之旅(3)

2012-12-29 
开始jbpm之旅(三)接下来要开始来学习一下标签了一个JPDL文件中一般有以下标签:1,start2,state3,end4,task5

开始jbpm之旅(三)
接下来要开始来学习一下标签了
一个JPDL文件中一般有以下标签:
1,start2,state3,end4,task5,sub-process6,customer7,decision8,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 />  <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");



热点排行