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对象。

 

 

 

原文地址:http://hi.baidu.com/cpuhandou/blog/item/f3c7df01fa26b81c728b65d4.html

转载于:https://www.cnblogs.com/gaoyoubo/archive/2010/09/29/1965087.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值