<tasknode>节点
task的4种事件类型
task-create task-assign task-start task-end
指派执行者的方式
actor-id="expression"分配方式
swimlane分配方式
assignmentHandler分配方式,编程方式
pooled-actor="1,2,3,4"分配方式
其中swimlane在上一篇讲start-state的一段中已经讲过 ,
而actort-id在一开始已经讲过,如
<task name="mytask">
<assignment actor-id="2"/> /actor-id="expression"分配方式
或者
<assignment actor-id="#{varName}"/> /actor-id="expression"分配方式
</task>
下面说明assignmentHandler分配方式(编程方式)
首先在流程定义的某个task里面指定由什么类来执行
<task name="mytask">
<assignment class="com.lm.TestAssignmentHandler"/>
</task>
后台编码里面使用:
如果遇到情况张三和李四各自的经理室要去数据库查出来的,就要使用编程方式指派assignmentHandler分配方式
public class TestAssignmentHandler implements AssignmentHandler
{
public void assign(Assignable assignable,ExecutionContext executionContext)throw
{
//从执行上下文中间取参数
String employeeId=(String)executionContext.getContextInstance().getVariable("actorId");
//把处理之后的数据再送回上下文
assignable.setActorId(getManager(employeeId));
}
//to do 实现getManager(String employeeId)方法
}
在这个基础下,谈谈关于pooled-actor="1,2,3,4"分配方式(拉),这种方式适合用于抢任务这种模型
比如说,一个任务给了一个小组,那么这个小组任何一个人都可以抢这个任务,谁先抢到谁先做
比如客服人员接电话,有可能就要求统计一个月内某人接电话的次数,来决定奖金给他多少。
实现方法如下(假设1,2,3,4是一个组的不同客服人员的id)
<task-node name="task-node1">
<task name="客服处理">
<assignment pooled-actors="1,2,3,4"></assignment>
</task>
<transition to="end-state1"></transition>
</task-node>
那么在后台
1:
JbpmContext jc=JbpmConfiguration.getInstance().createJbpmContext();
List li=jc.getTaskMgmtSession().findPooledTaskInstances((String)session.getAttribute("actorId"))//根据当前用户id看是否是某个组的,是就显示该组任务实例
把这个taskinstance列表显示
2:
点选某一条任务之后,记录下tiid
然后使用
JbpmContext jc=JbpmConfiguration.getInstance().createJbpmContext();
String tiid=request.getParameter("tiid");
TaskInstance ti=jc.loadTaskInstance(Long.parseLong(tiid));
if(ti.getStart()==null)//任务未开始,既数据库表中此任务的开始时间是null
ti.start((String)session.getAttribute("actorId"));//开始任务,并且把此用户设置为开始人
3:
此时回到用户本人的任务列表
应该发现多了一条任务,就是刚刚抢到的
同时在他的小组任务列表中,发现这条任务已经不存在
然后就可以想普通完成任务一样,编码处理这条任务
下面再说说会签和传阅
会签,N个人都在一起,都确认了,才能通过
传阅,有一个人看到就行了
<task-node name="B" signal="unsynchronized"/>直接离开节点,作用:
never 等待
first 任何一个任务实例完成则节点结束
first-wait 任何一个任务实例完成则节点等待
last(默认) 最后一个任务完成才算完成
last-wait 最后一个任务完成则等待
在tasknode里面,任务实例自动创建也可以被我们所阻止!!
任务分配给多个人
定义文件片段
<task-node name="B" create-tasks="false">//阻止自动创建实例
<task name="多个任务实例测试">
</task>
<event type="node-enter">
<action class="com.lm.MyMultiInstancesAction"/>
</event>
<transition name="notify applicant" to="notify applicant"/>
</task-node>
后台
public class MyMultiInstancesAction implements ActionHandler
{
public void execute(ExecutionContext executionContext) throws Exception
{
TaskNode taskNode = (TaskNode) executionContext.getNode();
//可能的情况 1,2,3给多少人分配
String actorIds = (String) executionContext.getProcessInstance().getContextInstance().getVariable("actorIds");
System.out.println("actorIds---------------------------:"+actorIds);
if (actorIds != null)
{
String ids[] = actorIds.split(",");
for (int i = 0; i < ids.length; i++)
{
Task task = taskNode.getTask("多个任务实例测试");//任务名字“多个任务实例测试”
TaskInstance ti=executionContext.getProcessInstance().getTaskMgmtInstance().createTaskInstance(task,executionContext.getToken());
ti.setActorId(ids[i]);
}
}
}
}
fork和join节点
配对使用,分叉和联合
token的生命周期
流程实例创建,Roottoken指向开始节点,注意的是Roottoken始终指向当前任务实例所处的位置,当遇到fork节点的时候,Roottoken会停留在前一个任务这里,根据分叉新建立几个子token,子token的生命周期是在fork和join之间,直到由这个fork开始的所有的子token都到达和它配对的那个join处,Rootoken才会一下子从前一个tasknode跳到join后面的一个