一步一步学JBPM(7)——EventListener监听流程信息

JBPM的使用中,很多时候我们要用到监听,前面讲过一个AssignmentHandler,它的作用更多的被用在动态分配任务中。AssignmentHandler虽然也能实现监听,但是有它的不足只出。它只能放到Task节点下,作为任务分配来使用。其它节点就不能用了。其它节点不会触发AssignmentHandler的方法。

 

在其它节点下监听流程信息,采取用户操作一般使用EventListenerEventListener可以放到任务节点下,不如process根目录,end节点,taskstate等节点。当有流程经过这个节点的时候就会出发节点事件所注册的类。

为了给一个流程或一个活动分配一系列的事件监听器,使用on元素来为事件监听器分组并指定事件

下面看一个我的实例:

1JPDL语言定义Event和注册EventListener类。

[html]  view plain copy
  1.   <end g="319,369,48,48" name="结束">  
  2.     <on event="start">  
  3.     <event-listener class="com.zhjy.bpm.Listener.EndListener">  
  4.     </event-listener>  
  5. </on>   
  6.   </end>  

这个监听是在End节点中注册一个监听类,这个类是我们自己写的。使用on元素来指定事件,这个需要注意的是on元素event属性可以配置为start或者end,这个为告诉jbpm这个事件是在end的开始执行开始完成执行。

2:编写Listener类。

[java]  view plain copy
  1. import org.jbpm.api.listener.EventListener;  
  2. import org.jbpm.api.listener.EventListenerExecution;  
  3. import org.jbpm.pvm.internal.env.EnvironmentImpl;  
  4.   
  5. import com.zhjy.mtdev.plan.PlanState;  
  6. import com.zhjy.mtdev.plan.service.IPlanService;  
  7.   
  8. /**    
  9.  * @Title: TaskListener.java  
  10.  * @author 李守宏   
  11.  * @date 2012-9-18 下午02:05:00  
  12.  * @version V1.0    
  13.  */  
  14. public class EndListener implements EventListener {  
  15.       
  16.     private static final long serialVersionUID = 1L;  
  17.   
  18.     /* (non-Javadoc) 
  19.      * @see org.jbpm.api.listener.EventListener#notify(org.jbpm.api.listener.EventListenerExecution) 
  20.      */  
  21.     @Override  
  22.     public void notify(EventListenerExecution execution) throws Exception {  
  23.         IPlanService  planService= (IPlanService) EnvironmentImpl.getFromCurrent("planService");  
  24.         String ownerId = execution.getVariable("planId").toString();  
  25.         String sign = execution.getVariable("sign").toString();  
  26.         if("通过".equals(sign)){  
  27.             planService.updateState(ownerId, PlanState.STORAGE.toString());  
  28.         }else if("补正".equals(sign)){  
  29.             planService.updateState(ownerId, PlanState.CORRECT.toString());  
  30.         }else{  
  31.             planService.updateState(ownerId, PlanState.REJECT.toString());  
  32.         }  
  33.           
  34.     }  
  35. }  

这里的notify方法是必须实现的。流程通过则触发这个事件,然后可以拿到流程执行的相关信息,通过execution可以获取流程信息,流程实例信息,甚至是任务信息,任务信息获取的方式是这样的。

[java]  view plain copy
  1.  TaskService taskService= (TaskService) EnvironmentImpl.getFromCurrent("taskService");  
  2. //获取流程ID  
  3. String id = execution.getProcessInstance().getId();  
  4. List<Task> task = taskService.createTaskQuery().processInstanceId(id).list();  

拿到Task列表以后,你就可以拿到很多信息。但是一定注意,在Task中获取已经存在的一个TaskID,然后去完成它会报错的。因为这个监听的过程中旧的任务ID已经不存在新的任务ID还没有生成,task是为空的。这个大家一定要注意,我在这块研究了很长时间。

 

总之上面说的两种监听,是jbpm常用的获取流程信息的方法,这样被动的监听信息,比主动的获取信息要方便很多,这是对观察者模式的良好应用。监听还可以结合其它技术使用,达到更好的效果比如泳道

SWIMLANE 等。达到任务的动态分配效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值