jbpm4.4 使用之活动标签

活动标签

-控制流程的活动

-原子活动

 

控制流程的活动

Start   开始节点,一个(主)流程只能有一个开始节点

End     结束节点,一个流程可以有多个结束节点

Decision 条件判断节点,当一个流程出现多个分支(情况),而分支排他时使用。

Fork    分支节点,当一个流程出现多个分支,而分支并列执行时使用。

Join    聚合/联合节点,通常与fork节点一起使用。

Sub-process 子流程(本人未曾使用过)

State   状态节点    一个暂停节点,当需要对流程的执行进行控制时使用。

Task    任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务

 

原子活动

Java、Script、Sql、Hql、Email

 

 

下面介绍三个最常用的活动

state

一个强制流程暂停的节点,当需要对流程的执行进行控制时使用。该节点可能什么都不需要做,也可能执行一些的操作。比如,路过银行,你拍怕裤兜,看看钱够还是不够。如果钱还可以花一段时间,你就不会去取钱。如果钱不多了,你就会去银行取些现金。或是钱本来就够花,但外面在下着雨,你想取避一避雨也不是不可以。State要做的相当于带你路过银行,至于你取不取钱,取多少,还是为了别的什么,不是它说了算,而是你自己的决定。

 

第一种方式:无分支的State

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="simpleState" xmlns="http://jbpm.org/4.3/jpdl">  
  4.    <start name="start1" g="368,117,48,48">  
  5.       <transition name="to state" to="state" g="-59,-17"/>  
  6.    </start>  
  7.    <end name="end" g="372,396,48,48"/>  
  8.    <state name="state" g="348,250,92,52">  
  9.       <transition name="to end" to="end" g="-47,-17"/>  
  10.    </state>  
  11. </process>  

 

测试代码如下:

Java代码   收藏代码
  1. ProcessInstance processInstance =   
  2.             executionService.startProcessInstanceByKey("simpleState");  
  3.         System.out.println("流程实例Id:"+  
  4.                 processInstance.getId());  
  5.         System.out.println("流程定义Id:"+  
  6.                 processInstance.getProcessDefinitionId());            
  7.         System.out.println("是否在 state节点:"+  
  8.                 processInstance.isActive("state"));//true  
  9.         System.out.println("判断流程是否结束:"+  
  10.                 processInstance.isEnded());//false  
  11.           
  12.         processInstance =   
  13.             executionService.signalExecutionById(processInstance.getId());  
  14.         System.out.println("是否在 state节点:"+  
  15.                 processInstance.isActive("state"));//true  
  16.         System.out.println("判断流程是否结束:"+  
  17.                 processInstance.isEnded());//false  

 

执行结果如下:

Consult代码   收藏代码
  1. 流程实例Id:simpleState.7  
  2. 流程定义Id:simpleState-1  
  3. 是否在 state节点:true  
  4. 判断流程是否结束:false  
  5. **************  
  6. 是否在 state节点:false  
  7. 判断流程是否结束:true  

 

第二种方式:有分支的state

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="compState" xmlns="http://jbpm.org/4.3/jpdl">  
  4.    <start name="start1" g="300,106,48,48">  
  5.       <transition name="to proot" to="proot" g="-59,-17"/>  
  6.    </start>  
  7.    <end name="end" g="315,448,48,48"/>  
  8.    <state name="proot" g="281,223,92,52">  
  9.       <transition name="to boy" to="boy" g="-59,-17"/>  
  10.       <transition name="to girl" to="girl" g="-59,-17"/>  
  11.    </state>  
  12.    <state name="boy" g="187,346,92,52">  
  13.       <transition name="to end" to="end" g="-47,-17"/>  
  14.    </state>  
  15.    <state name="girl" g="383,342,92,52">  
  16.       <transition name="to end" to="end" g="-47,-17"/>  
  17.    </state>  
  18. </process>  

 

测试代码如下:

Java代码   收藏代码
  1. ProcessInstance processInstance =   
  2.             executionService.startProcessInstanceByKey("compState");  
  3.           
  4.         System.out.println("是否在 proot节点:"+  
  5.                 processInstance.isActive("proot"));//true  
  6.         System.out.println("是否在 boy节点:"+  
  7.                 processInstance.isActive("boy"));//false  
  8.           
  9.         System.out.println("是否在 girl节点:"+  
  10.                 processInstance.isActive("girl"));//false  
  11.           
  12.         System.out.println("判断流程是否结束:"+  
  13.                 processInstance.isEnded());//false  
  14.           
  15.         processInstance =   
  16.             executionService.signalExecutionById(processInstance.getId(),"to boy");//因为proot往下有多个分支,如果不指定流程转向,流程不会继续往下执行  
  17.         System.out.println("是否在 proot节点:"+  
  18.                 processInstance.isActive("proot"));//false  
  19.         System.out.println("是否在 boy节点:"+  
  20.                 processInstance.isActive("boy"));//true  
  21.         System.out.println("是否在 girl节点:"+  
  22.                 processInstance.isActive("girl"));//false  
  23.         System.out.println("判断流程是否结束:"+  
  24.                 processInstance.isEnded());//false    

 

executionService.signalExecutionById(processInstance.getId(),"to boy");

这句如果改为:

executionService.signalExecutionById(processInstance.getId());

则流程不会往下执行,流程继续停留在proot节点。

 

decision  

条件判断节点,当一个流程出现多个中情况而各种情况都排他时使用,相当于switch case.

第一种方式:decision内置condition

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <process key="deci" name="deci" xmlns="http://jbpm.org/4.3/jpdl">  
  3.    <start g="358,77,48,48" name="start1">  
  4.       <transition g="-83,-17" name="to exclusive1" to="exclusive1"/>  
  5.    </start>  
  6.    <end g="374,510,48,48" name="end"/>  
  7.    <decision g="358,219,48,48" name="exclusive1">  
  8.       <transition g="-59,-17" name="to 200" to="200">  
  9.         <condition expr="#{errorcode == 200}"/>  
  10.       </transition>  
  11.       <transition g="-59,-17" name="to 404" to="404">  
  12.         <condition expr="#{errorcode == 404}"/>  
  13.       </transition>  
  14.       <transition g="-59,-17" name="to 500" to="500">        
  15.         <condition expr="#{errorcode == 500}"/>  
  16.       </transition>  
  17.    </decision>  
  18.    <state g="194,351,92,52" name="200">  
  19.       <transition g="-47,-17" name="to end" to="end"/>  
  20.    </state>  
  21.    <state g="340,349,92,52" name="404">  
  22.       <transition g="-47,-17" name="to end" to="end"/>  
  23.    </state>  
  24.    <state g="476,349,92,52" name="500">  
  25.       <transition g="-47,-17" name="to end" to="end"/>  
  26.    </state>  
  27. </process>  

 

 

测试代码如下:

Java代码   收藏代码
  1. Map<String, String> variables = new HashMap<String, String>();  
  2.         variables.put("errorcode""200");  
  3.         ProcessInstance processInstance =   
  4.             executionService.startProcessInstanceByKey("deci", variables);  
  5.           
  6.         System.out.println("200 isActive:"+  
  7.                 processInstance.isActive("200"));//进入state 200,暂停  
  8.         System.out.println("processInstance isEnd:"+  
  9.                 processInstance.isEnded()); //流程未结束,返回false  
  10.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  11.           
  12.         //该方法返回processInstance如果不接收,processInstance还是原来的对象  
  13.         //如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态  
  14.         processInstance=  
  15.             executionService.signalExecutionById(processInstance.getId());  
  16.           
  17.         System.out.println("processInstance isEnd:"+  
  18.                 processInstance.isEnded()); //流程结束,返回true  
  19.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  

 

控制台输出结果如下:

Consult代码   收藏代码
  1. 200 isActive:true  
  2. processInstance isEnd:false  
  3. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  4. ********  
  5. processInstance isEnd:true  
  6. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  

 

第二种方式:为decision活动设置expr

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <process name="deciBaseExpr" xmlns="http://jbpm.org/4.3/jpdl">  
  3.    <start name="start1" g="407,65,48,48">  
  4.       <transition name="to exclusive1" to="exclusive1" g="-83,-17"/>  
  5.    </start>  
  6.    <end name="end1" g="418,497,48,48"/>  
  7.    <decision name="exclusive1" g="409,207,48,48" expr="#{whatcode}">  
  8.       <transition name="to 200" to="200" g="-59,-17"/>  
  9.       <transition name="to 404" to="404" g="-59,-17"/>  
  10.       <transition name="to 500" to="500" g="-59,-17"/>  
  11.    </decision>  
  12.    <state name="200" g="251,344,92,52">  
  13.       <transition name="to end1" to="end1" g="-47,-17"/>  
  14.    </state>  
  15.    <state name="404" g="389,342,92,52">  
  16.       <transition name="to end1" to="end1" g="-47,-17"/>  
  17.    </state>  
  18.    <state name="500" g="516,341,92,52">  
  19.       <transition name="to end1" to="end1" g="-47,-17"/>  
  20.    </state>  
  21. </process>  

 

测试代码如下:

Java代码   收藏代码
  1. Map<String, String> variables = new HashMap<String, String>();  
  2.         variables.put("whatcode""to 404");  
  3.         ProcessInstance processInstance =   
  4.             executionService.startProcessInstanceByKey("deciBaseExpr", variables);  
  5.           
  6.         System.out.println("200 isActive:"+  
  7.                 processInstance.isActive("200"));//返回false  
  8.         System.out.println("404 isActive:"+  
  9.                 processInstance.isActive("404"));//返回true  
  10.         System.out.println("500 isActive:"+  
  11.                 processInstance.isActive("500"));//返回false  
  12.         System.out.println("processInstance isEnd:"+  
  13.                 processInstance.isEnded()); //流程未结束,返回false  
  14.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  15.           
  16.         //该方法返回processInstance如果不接收,processInstance还是原来的对象  
  17.         //如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态  
  18.         processInstance=  
  19.             executionService.signalExecutionById(processInstance.getId());  
  20.           
  21.         System.out.println("processInstance isEnd:"+  
  22.                 processInstance.isEnded()); //流程结束,返回true  
  23.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  

 

控制台输出结果如下:

Consult代码   收藏代码
  1. 200 isActive:false  
  2. 404 isActive:true  
  3. 500 isActive:false  
  4. processInstance isEnd:false  
  5. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  6. ***************  
  7. processInstance isEnd:true  
  8. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  

 

第三种方式:为decision配置handler

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <process name="deciByHandler" key="deciByHandler" xmlns="http://jbpm.org/4.3/jpdl">  
  3.    <start name="start1" g="341,55,48,48">  
  4.       <transition name="to exclusive1" to="exclusive1" g="-83,-17"/>  
  5.    </start>  
  6.    <end name="end1" g="346,435,48,48"/>  
  7.    <decision name="exclusive1" g="340,164,48,48">  
  8.       <handler class="com.lihua.HandlerDecision"></handler>  
  9.       <transition name="to 200" to="200" g="-59,-17"/>  
  10.       <transition name="to 404" to="404" g="-59,-17"/>  
  11.       <transition name="to 500" to="500" g="-59,-17"/>  
  12.    </decision>  
  13.    <state name="200" g="178,315,92,52">  
  14.       <transition name="to end1" to="end1" g="-47,-17"/>  
  15.    </state>  
  16.    <state name="404" g="322,309,92,52">  
  17.       <transition name="to end1" to="end1" g="-47,-17"/>  
  18.    </state>  
  19.    <state name="500" g="461,309,92,52">  
  20.       <transition name="to end1" to="end1" g="-47,-17"/>  
  21.    </state>  
  22. </process>  

 

Handler类:

 

Java代码   收藏代码
  1. package com.lihua;  
  2.   
  3. import org.jbpm.api.jpdl.DecisionHandler;  
  4. import org.jbpm.api.model.OpenExecution;  
  5.   
  6. public class HandlerDecision implements DecisionHandler {  
  7.   
  8.     private static final long serialVersionUID = -1639139174140348966L;  
  9.   
  10.     @Override  
  11.     public String decide(OpenExecution execution) {  
  12.         return (String) execution.getVariable("towhere");      
  13.     }  
  14.   
  15. }  

 

测试代码如下:

Java代码   收藏代码
  1. Map<String, String> variables =   
  2.             new HashMap<String, String>();  
  3.         variables.put("towhere""to 500");  
  4.         ProcessInstance processInstance =   
  5.             executionService.  
  6.             startProcessInstanceByKey("deciByHandler", variables);  
  7.           
  8.         System.out.println("200 isActive:"+  
  9.                 processInstance.isActive("200"));//返回 false  
  10.         System.out.println("404 isActive:"+  
  11.                 processInstance.isActive("404"));//返回 false  
  12.         System.out.println("500 isActive:"+  
  13.                 processInstance.isActive("500"));//返回 true  
  14.         System.out.println("processInstance isEnd:"+  
  15.                 processInstance.isEnded()); //流程未结束,返回false  
  16.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  17.           
  18.         //该方法返回processInstance如果不接收,processInstance还是原来的对象  
  19.         //如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态  
  20.         processInstance=  
  21.             executionService.signalExecutionById(processInstance.getId());  
  22.           
  23.         System.out.println("processInstance isEnd:"+  
  24.                 processInstance.isEnded()); //流程结束,返回true  
  25.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  

 

控制台输出结果如下:

Consult代码   收藏代码
  1. 200 isActive:false  
  2. 404 isActive:false  
  3. 500 isActive:true  
  4. processInstance isEnd:false  
  5. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  6. ************  
  7. processInstance isEnd:true  
  8. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  

 

以上三种方式差别都不是很大,第三中在程序中通过Handler进行复杂的处理。个人觉得,如果对于逻辑不是很复杂的操作,前两种方式是比较可取的。但如果逻辑过于复杂,或者还有其他的操作比如同步数据库中的其他信息等操作时,不妨选择第三种方式。

这些代码代码比较简单,这里就不做过多的解释。

 

Task

任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务.

Task的assignee属性

 

第一, assignee用来指示用户,负责完成任务的人。分配人是一个任务中的字符串属性,引用一个用户。(直接指定一个字符串)

第二,这个属性默认会当做表达式来执行。(指定一个表达式,然后在代码里为该表达式赋值) 如:在这里任务被分配给#{order.owner}。这意味着首先使用order这个名字查找一个对象。 其中一个查找对象的地方是这个任务对应的流程变量。 然后getOwner()方法会用来获得用户id, 引用的用户负责完成这个任务。

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="task" xmlns="http://jbpm.org/4.3/jpdl">  
  4.    <start name="start1" g="390,97,48,48">  
  5.       <transition name="to task" to="task" g="-53,-17"/>  
  6.    </start>  
  7.    <end name="end1" g="391,362,48,48"/>  
  8.    <task name="task" g="368,239,92,52" assignee="${taskAssignee}">  
  9.       <transition name="to end1" to="end1" g="-47,-17"/>  
  10.    </task>  
  11. </process>  

 

 

测试代码如下:

Java代码   收藏代码
  1. Map<String,String> map=  
  2.             new HashMap<String, String>();  
  3.         map.put("taskAssignee""lihua");  
  4.         ProcessInstance processInstance=null;  
  5.         for (int i = 0; i < 2; i++) {  
  6.             processInstance=executionService.  
  7.             startProcessInstanceByKey("task",map);            
  8.             System.out.println("流程是否处于task节点:"+  
  9.                     processInstance.isActive("task"));//true  
  10.             System.out.println("流程实例Id:"+  
  11.                     processInstance.getId());  
  12.         }  
  13.         List<Task> list=taskService.findPersonalTasks("lihua");  
  14.         for (Task task : list) {  
  15.             System.out.println("任务活动名称:"+  
  16.                     task.getActivityName());  
  17.             System.out.println("流程实例Id:"+  
  18.                     task.getExecutionId());  
  19.             System.out.println("任务活动Id:"+  
  20.                     task.getId());  
  21.             System.out.println("任务活动创建时间:"+  
  22.                     task.getCreateTime());  
  23.             System.out.println("任务活动进度:"+  
  24.                     task.getProgress());  
  25.             System.out.println("任务活动分配给:"+  
  26.                     task.getAssignee());  
  27.             System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  28.         }  

 

控制台输出结果如下:

Consult代码   收藏代码
  1. 流程是否处于task节点:true  
  2. 流程实例Id:task.7  
  3. ************  
  4. 流程是否处于task节点:true  
  5. 流程实例Id:task.11  
  6. *****************  
  7. 任务活动名称:task  
  8. 流程实例Id:task.11  
  9. 任务活动Id:13  
  10. 任务活动创建时间:2012-02-16 15:48:50.406  
  11. 任务活动进度:null  
  12. 任务活动分配给:lihua  
  13. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  14. 任务活动名称:task  
  15. 流程实例Id:task.7  
  16. 任务活动Id:9  
  17. 任务活动创建时间:2012-02-16 15:48:50.375  
  18. 任务活动进度:null  
  19. 任务活动分配给:lihua  
  20. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  

 

 

Tips代码   收藏代码
  1. 1、在流程设置时如果出现乱码可在Eclipse.ini中添加如下配置:  
  2. -Dfile.encoding=UTF-8  
  3. 2、在jbpm中表达式$(),#()均可以成功解析。  

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值