【转】JBPM TASK

JBPM TASK

 
 

1) 任务分配给单个用户
org.jbpm.examples.task.assignee的例子修改一下其中的jpdl文件,代码如下:

 

 
 
<? xml version="1.0" encoding="UTF-8" ?> < process name ="TaskAssignee" xmlns ="http://jbpm.org/4.3/jpdl" > <!-- 开始节点 --> < start g ="20,20,48,48" > < transition to ="review" /> <!-- 节点启动后转入name为review的节点 --> </ start > <!-- 任务节点 --> < task name ="review" assignee ="#{owner}" g ="96,16,127,52" > <!-- #{}中的参数表示变量名,此处的变量名为owner --> < transition to ="wait" /> <!-- 节点执行后转入name为wait的节点 --> </ task > <!-- 等待节点 --> < state name ="wait" g ="255,16,88,52" /> </ process >
复制代码

 

 

 

部署完流程后,启动流程实例并分配给owner=HanDou的用户:

 
 
Map < String, Object > variables = new HashMap < String, Object > (); variables.put( " owner " , " HanDou " ); ProcessInstance processInstance = executionService.startProcessInstanceByKey( " TaskAssignee " , variables);
复制代码

 

 

 

通过流程实例ID,查找用户为HanDou的任务:

 

 
 
String pid = processInstance.getId(); List < Task > taskList = taskService.findPersonalTasks( " HanDou " );
复制代码

 

用户执行当前任务:
taskService.completeTask(taskList.get(0).getId());

2) 任务处理器

 
 
org.jbpm.examples.task.assignmenthandler的例子,jpdl文件源码如下: <? xml version="1.0" encoding="UTF-8" ?> < process name ="TaskAssignmentHandler" xmlns ="http://jbpm.org/4.3/jpdl" > < start g ="20,20,48,48" > < transition to ="review" /> </ start > < task name ="review" g ="96,16,127,52" > <!-- 配置处理器类为org.jbpm.examples.task.assignmenthandler.AssignTask --> < assignment-handler class ="org.jbpm.examples.task.assignmenthandler.AssignTask" > <!-- 配置AssignTask类中的属性assignee --> < field name ="assignee" > <!-- 配置AssignTask类中的属性assignee 的值为HanDou --> < string value ="HanDou" /> </ field > </ assignment-handler > < transition to ="wait" /> </ task > < state name ="wait" g ="255,16,88,52" /> </ process >
复制代码

 

 

 

流程发布启动流程实例后,节点流转到review,调用 org.jbpm.examples.task.assignmenthandler.AssignTask类的assign()方法,将传入的 assignee的值HanDou作为任务的候选人分配,类AssignTask必须实现AssignmentHandler接口,重写 assign(Assignable assignable, OpenExecution execution)方法。
其源码如下:

 
 
public class AssignTask implements AssignmentHandler { private static final long serialVersionUID = 1L ; String assignee; public void assign(Assignable assignable, OpenExecution execution) { assignable.setAssignee(assignee); } }
复制代码

 

 

 

3) 任务分配给群组用户
org.jbpm.examples.task.candidates包中的例子:

 
 
<? xml version="1.0" encoding="UTF-8" ?> < process name ="TaskCandidates" xmlns ="http://jbpm.org/4.3/jpdl" > < start g ="20,20,48,48" > < transition to ="review" /> </ start > < task name ="review" candidate-groups ="sales-dept" g ="96,16,127,52" > <!-- 通过candidate-groups 将任务分配为sales-dept(销售部门) --> < transition to ="wait" /> </ task > < state name ="wait" g ="255,16,88,52" /> </ process >
复制代码

 

 

 


在流程实例发布时通过org.jbpm.api. IdentityService对象创建群组与用户之间的关系,如测试用例中:

 
 
// 创建一个sales-dept组 String dept = identityService.createGroup( " sales-dept " ); // 创建一个用户,参数为(userId,givenName,familyName) identityService.createUser( " johndoe " , " John " , " Doe " ); // 创建一个用户与群组间关系,参数为(userId,groupId,role) identityService.createMembership( " johndoe " , dept, " developer " ); 测试类的测试方法注释: public void testGroupCandidateAssignment() { // 启动流程TaskCandidates ProcessInstance processInstance = executionService.startProcessInstanceByKey( " TaskCandidates " ); // 查询群组任务 ,调用方法findGroupTasks( String userId) List < Task > taskList = taskService.findGroupTasks( " johndoe " ); Task task = taskList.get( 0 ); // 将任务委派给johndoe,成为johndoe的assigned任务 taskService.takeTask(task.getId(), " johndoe " ); // 处理完毕后群组任务为空 taskList = taskService.findGroupTasks( " johndoe " ); assertEquals( 0 , taskList.size()); // 查询 johndoe的assigned任务 taskList = taskService.findPersonalTasks( " johndoe " ); task = taskList.get( 0 ); // johndoe 处理任务 taskService.completeTask(task.getId()); }
复制代码

 

 

注意点:当群组任务在没有调用taskService# takeTask方法之前,调用taskService#findGroupTasks(userId)是查询不到代办任务的,只有将任务委派给某个用户之后这个用户才可处理任务。

4) 任务分配之泳道
以3)的jpdl文件为例,添加泳道的定义(加粗斜体部分),详细如下:

 
 
<? xml version="1.0" encoding="UTF-8" ?> < process name ="TaskCandidates" xmlns ="http://jbpm.org/4.3/jpdl" > <!-- 定义泳道,将任务委派给群组sales-dept --> < swimlane name ="sales representative" candidate-groups ="sales-dept" /> < start g ="20,20,48,48" > < transition to ="review" /> </ start > < task name ="review" swimlane ="sales representative" <!-- 通过swimlane将任务指向name为sales representative的泳道定义-- > g="96,16,127,52"> <!-- 通过candidate-groups 将任务分配为sales-dept(销售部门) --> < transition to ="wait" /> </ task > < state name ="wait" g ="255,16,88,52" /> </ process >
复制代码

 


当流程定义在jpdl文件定义完毕后,其处理过程同3)的Java类的调用和处理。

 

5) 任务分配并传递参数
在任务分配的同时,实际需求中往往需要添加其他的参数,比如和任务相关的业务数据,可以通过流程实例ID与业务数据的某标识ID关联,业务数据存入业务数据表,jbpm数据存入jbpm数据表中;与流程相关的参数,还可以通过jBPM的API设置参数。
在org.jbpm.examples.task.variables.包中的测试用例TaskVariablesTest类中有:

 
 
Map < String, Object > variables = new HashMap < String, Object > (); variables.put( " category " , " big " ); variables.put( " dollars " , 100000 ); Execution execution = executionService.startProcessInstanceByKey( " TaskVariables " , variables);
复制代码

 


这段是在启动一个流程时,同时传入参数variables(Map可以保存多个变量的键值对),同时,在jbpm的API中,taskService#getVariableNames(taskId)方法用于获取任务ID为taskId的任务变量集合(SET)。
variables = taskService.getVariables(taskId, variableNames);//这个方法获取的是变量的HashMap对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值