本来是要写end活动的,感觉比较简单,就直接进入task活动。
Task活动是一个重难点。
定义:在jbpm中,task活动一般用来处理涉及人机交互的活动。我们可以使用task活动的assignee属性将一个任务分配给指定的用户。
示例一:熟练一下基本功能
对应的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
<start>
<transition to="review"/>
</start>
<!-- EL表达式 "#{order.owner}"的值在这里表示分配者ID -->
<task name="review" assignee="#{order.owner}">
<transition to="wait" />
</task>
<state name="wait" />
</process>
对应的order代码如下:
package org.test;
import java.io.Serializable;
public class Order implements Serializable{
private String owner;
public Order(){
}
public Order(String owner){
this.owner=owner;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
注意:假如不实现Serializable的话,会给你报错。
测试代码如下:
package org.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.task.Task;
import org.jbpm.test.JbpmTestCase;
public class TestTask extends JbpmTestCase {
String deploymentId;
@Override
public void setUp() throws Exception {
super.setUp();
deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("org/test/task.jpdl.xml").deploy();
System.out.println("启动成功");
}
@Override
public void tearDown() throws Exception {
repositoryService.deleteDeploymentCascade(deploymentId);
super.tearDown();
System.out.println("销毁成功");
}
public void testTask() {
Map<String, Object> variables = new HashMap<String, Object>();
// 用户ID为afei
variables.put("order", new Order("afei"));
ProcessInstance pi = executionService.startProcessInstanceByKey(
"TaskAssignee", variables);
List<Task> taskList=taskService.findPersonalTasks("afei");
Task task=taskList.get(0);
System.out.println("task.getActivityName()"+task.getActivityName());
}
}
Jbpm支持将任务分配给一组候选用户,组中的一个用户可以接受这个任务并完成它,这就是任务的候选者机制。Task活动的候选者属性有:candidate-groups和candidate-users。
示例二:用户组概念
对应的jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
<start>
<transition to="review" />
</start>
<!-- 在这里用字符串应用了一个用户组:sales-dept -->
<task name="review" candidate-groups="sales-dept">
<transition to="wait" />
</task>
<state name="wait" />
</process>
流程实例发起后,任务review会被创建。这个任务不会显示在任何人的个人任务列表中,因为还没有创建sales-dept组。因此下面获取的个人任务列表将是空(empty)的:
taskService.getAssignedTasks(“afei”);
taskService.getAssignedTasks(“angel”);
但是此任务会显示在sales-dept组成员的分组任务列表,可以通过service Api的taskService.findGroupTasks获取。
接下来,我们就将afei和angel这两个用户创建并加入sales-dept住,这需要使用到IdentiryService服务:
ProcessInstance pi=executionService.startProcessInstanceByKey("TaskAssignee");
// 首先创建sales-dept组
String groupName = "sales-dept";
identityService.createGroup(groupName);
// 创建用户afei
identityService.createUser("afei", "afei", "du", "664659008@qq.com");
// 将afei加入sales-dept组
identityService.createMembership("afei", groupName);
// 创建用户angel
identityService.createUser("angel", "angel", "peng", "295737589@qq.com");
// 将angel加入sales-dept组
identityService.createMembership("angel", groupName);
/* 此时,在流程实例发起后,review任务就会出现在用户afei和angel的分组任务列表中,即一下代码的执行结果非空 */
List<Task> afeiTasks = taskService.findGroupTasks("afei");
List<Task> angelTasks = taskService.findGroupTasks("angel");
System.out.println(afeiTasks.size());
Task afeiTask = afeiTasks.get(0);
// afei接受任务操作
taskService.takeTask(afeiTask.getId(), "afei");
assertNull(taskService.findGroupTasks("afei"));
与candidate-groups属性类似的,candidate-users属性可以用来处理逗号分隔的系列用户ID,candidate-users属性可以和其他任务分配属性结合使用。
但是,如果我们需要在分配任务时加入一些复杂的业务逻辑计算呢。显示我们得找出另外的解决方案。“任务分配处理器”是个很不错的选择。
首先,得实现AssignmentHandler接口。
package org.test;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
public class AssignTask implements AssignmentHandler {
private String assignee;
@Override
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
assignable.setAssignee(assignee);
System.out.println("assignee: "+assignee);
}
}
Jpdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="TaskAssignee" xmlns="http://jbpm.org/4.4/jpdl">
<start>
<transition to="review" />
</start>
<task name="review">
<!-- 在这里的类就是实现了AssignmentHandler接口的 -->
<assignment-handler class="org.test.AssignTask">
<!-- field元素为任务分配处理器的assignee域注入值。这种注入方式对于jbpm的用户代码都是通用的 -->
<field name="assignee" >
<string value="afei" />
</field>
</assignment-handler>
<transition to="wait" />
</task>
<state name="wait" />
</process>
Ok,单元测试如下:
Map<String,Object> vals=new HashMap<String, Object>();
vals.put("order",new Order("afei"));
ProcessInstance pi = executionService
.startProcessInstanceByKey("TaskAssignee",vals);
// afei是通过jpdl定义注入的任务分配者
List<Task> taskList = taskService.findPersonalTasks("afei");
// 断言afei有一个任务
assertEquals(1, taskList.size());
Task task = taskList.get(0);
// 断言任务名称如定义的 "review"
assertEquals("review", task.getName());
// 断言任务的分配者如预期
assertEquals("afei", task.getAssignee());
当然 就像你看到的,AssignmentHandler提供的execution对象可以获得流程上下文和变量,可以结合其他任何API来计算出任务的分配者和候选者,单个用户和用户组。比如你可以这样做:
在启动流程实例时候,加一个参数:
Map<String,Object> vals=new HashMap<String, Object>();
vals.put("order",new Order("angel"));
然后在你的任务分配处理器实现类中加入:
Order order=(Order)execution.getVariable("order");
assignable.setAssignee(order.getOwner());
就可以自动控制分配人了。
下一篇继续task活动其他内容!!!
分享到:
相关推荐
jbpm学习笔记:安装插件、配置环境、发布流程定义、查看流程定义
主要关于如何使用jbpm,使用jbpm里的方法,如定义流程,流程实例如何与公文绑定,如何让公文流转到下一步,查看我手上有多少公文等,以及如何把jbpm集成到其它项目里面。
JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——09_任务实例与任务分配.7z JBPM采购申请系统——...
jbpm学习日记,我在学习中的体会有很大帮助
jpdl描述工作流《jBPM学习笔记_框架设计简介》
9.3.4task(任务活动) 31 9.3.5decision(判断活动) 31 9.3.6fork/join(分支/聚合活动) 31 9.4事件 31 10Transition 31 11state 32 11.1 定义 32 11.2signal方法 33 12task 34 12.1task的执行 34 12.2设置任务执行人 ...
个人学习jbpm的文档,其中包括一些bug的修改。主要以《jbpm流程》一书为参考
这是我在吉林大学学习时的笔记,Java,工作流,JBPM,学习笔记
最近通过使用jbpm,学习了一下,自己整理的一份jbpm的学习笔记,,希望对你们有帮助
入门材料 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记
jbpm学习资料,jBPM-jPDL学习笔记,很详细。。。。。。。。。。。jbpm教程
火龙果软件工程技术中心 相关资料:《jBPM学习笔记(V3.2环境部署)》《jBPM学习笔记(流程设计与控制)》概述:jBPM(JBossBusinessProcessManagement业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域...
jbpm任务分配管理.doc,介绍任务是如何分配的
JBPM新手学习笔记(强烈推荐)
NULL 博文链接:https://wjt276.iteye.com/blog/690307
工作流学习,在系统开发当中占有十分重要的作用
jbpm开发指南 jbpm开发指南 jbpm 工作流 自定义
jbpm-human-task-5.1.0.Final.jar jbpm5
JBPM采购申请系统——10_任务事件与任务控制器.7z JBPM采购申请系统——10_任务事件与任务控制器.7z JBPM采购申请系统——10_任务事件与任务控制器.7z JBPM采购申请系统——10_任务事件与任务控制器.7z JBPM采购申请...