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