一步一步学JBPM(6)——AssignmentHandler获取流程相关信息

在使用流程的时候,很多时候我们需要在流程的执行过程中获取流程的当前信息,比如任务信息,流程定义信息,流程实例信息等。然后根据这些信息采取相关的操作。我们主动的去做这些操作是非常不方便的。我像大家介绍两种方法,这两种方式都是基于观察者模式的,将主动获取信息,变成被动推送信息。首先介绍一种使用AssignmentHandler的方式。

AssignmentHandler是任务分配的一个接口。需要我们去实现它。然后在配置文件配置。

 

1:在jpdl文件中配置AssignmentHandler

我们在task节点中可以使用它为。配置方式如下:其中field是一个变量,可以在流程执行到这里的时候拿到这个参数的value。也可以动态改变这个value

[html]  view plain copy
  1. <task assignee="pzhuren" name="主任审批" g="186,291,92,52">  
  2.       <assignment-handler class="com.zhjy.bpm.Listener.TaskListener">  
  3.             <field name="msg">  
  4.                 <string value="PLAN"/>  
  5.             </field>   
  6. lt;/assignment-handler>    
  7.    <transition name="通过审批" to="结束" g="-62,-25"/>  
  8. </task>  

2:编写自己的AssignmentHandler类实现AssignmentHandler接口。


[java]  view plain copy
  1. package com.zhjy.bpm.Listener;  
  2.   
  3. import java.util.Date;  
  4. import org.jbpm.api.TaskService;  
  5. import org.jbpm.api.model.OpenExecution;  
  6. import org.jbpm.api.task.Assignable;  
  7. import org.jbpm.api.task.AssignmentHandler;  
  8. import org.jbpm.pvm.internal.env.EnvironmentImpl;  
  9. import org.jbpm.pvm.internal.task.OpenTask;  
  10.   
  11. import com.zhjy.mtdev.wibox.taskins.ProcessWorkState;  
  12. import com.zhjy.mtdev.wibox.taskins.WorkerType;  
  13. import com.zhjy.mtdev.wibox.taskins.dao.IProjectProcessWorkersDAO;  
  14. import com.zhjy.mtdev.wibox.taskins.domain.IProjectProcessWorkers;  
  15. import com.zhjy.mtdev.wibox.taskins.domain.hibernate.ProjectProcessWorkersHibernate;  
  16. import com.zhjy.mtdev.wibox.taskins.service.IProjectTaskInsService;  
  17.   
  18. /** 
  19.  * @Title: TaskListener.java 
  20.  * @Package com.zhjy.bpm.test.Listener 
  21.  * @author 李守宏 
  22.  * @date 2012-9-18 下午02:05:00 
  23.  * @version V1.0 
  24.  */  
  25. public class TaskListener implements AssignmentHandler {  
  26.   
  27.     private String msg;  
  28.   
  29.     private static final long serialVersionUID = 1L;  
  30.   
  31.     @Override  
  32.     public void assign(Assignable assignable, OpenExecution execution)  
  33.             throws Exception {  
  34.   
  35.         IProjectProcessWorkers processWorkers = new ProjectProcessWorkersHibernate();  
  36.         TaskService taskService = (TaskService) EnvironmentImpl  
  37.                 .getFromCurrent("taskService");  
  38.         IProjectTaskInsService taskInsService = (IProjectTaskInsService) EnvironmentImpl  
  39.                 .getFromCurrent("projectTaskInsService");  
  40.           
  41.         OpenTask task = (OpenTask) assignable;  
  42.   
  43.         String taskId = task.getId();  
  44.         // 设置参数  
  45.         processWorkers.setCreateDate(new Date());  
  46.         // 这里直接拿到流程的key值作为项目计划ID,因为项目计划提交到流程的时候,要设置一个key值,也就是计划的project_plan_id到流程实例中  
  47.         // String ownerId = execution.getKey().toString();  
  48.         /* 
  49.          * if(taskService.getVariable(taskId, "ownerId").toString() == "" ){ 
  50.          * ownerId = }else{ ownerId = taskService.getVariable(taskId, 
  51.          * "ownerId").toString(); } 
  52.          */  
  53.         String ownerId = execution.getVariable("planId").toString();  
  54.         processWorkers.setOwnerId(ownerId);  
  55.         // 这个计划类型,直接从jbdl的流程变量msg中获取  
  56.         processWorkers.setOwnerType(msg);  
  57.         // 流程定义ID  
  58.         processWorkers.setProcessId(execution.getId());  
  59.         // 更新状态为已完成 对应的是执行中  
  60.         processWorkers.setState(ProcessWorkState.DOING.toString());  
  61.         // 这个任务接受人ID要提前在jbdl中配置,使用它的getAssignee  
  62.         processWorkers.setWorkerId(task.getAssignee());  
  63.         processWorkers.setWorkerType(WorkerType.JOBROLE.toString());  
  64.         processWorkers.setWorkId(taskId);  
  65.         //后来加入的四个字段  
  66.         //1:workName;工作任务名称(所在节点名称)  
  67.         processWorkers.setWorkName(task.getActivityName().toString());  
  68.         //2:前置工作ID prevId 从变量获取  
  69.         processWorkers.setPrevId(execution.getVariable("prevId").toString());     
  70.         taskInsService.addProcessWork(processWorkers);  
  71.   
  72.     }  
  73.   
  74.     /** 
  75.      * @param msg 
  76.      *            the msg to set 
  77.      */  
  78.     public void setMsg(String msg) {  
  79.         this.msg = msg;  
  80.     }  
  81.   
  82. }  

这里是我使用AssignmentHandler 实现获取流程信息,然后插入一条新数据的实例。其中assign是必须实现的,这里面的两个参数是最重要的,根据这两个参数,可以获取流程的很多信息。比如流程定义,流程实例,流程任务等。

注意OpenTask task= (OpenTask) assignable;这句话是关键,你可以把assignable强制转换成task,因为他实现了task接口。这样你就可以拿到任务信息了。这块是这个方法的核心,是我花费了很大精力,通过研究jbpm源码才弄明白的。这块网上还没有见到这种做法。

 

jbpm有很多的监听,这个只是其中一个,监听大大提升了jbpm的灵活性,为我们提供了很多方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值