当前位置: 首页 > 工具软件 > jBPM > 使用案例 >

JBPM(四)

时衡虑
2023-12-01

<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后面的一个


 

 

 

 类似资料: