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