zoukankan      html  css  js  c++  java
  • JBPM (五) Task通过EL表达式和AssignHandler监听分配任务

    • Task任务介绍
      task一般用来处理人机交互的活动,task的活动在jbpm乃至整个工作流中都有重要的意
    义,因为处理人工任务和电子表单是工作流中最为繁琐和细致的工作,很多的任务组成了流程的交互,在任务创建好之后要与人员交互,就要关联到具体的人员上,task给我们提供了一些自身属性来完成关联,这里我们介绍Assignee属性怎么使用。
    • 分配task的几种方式
    • 在流程设计的时候,就直接指定用户/用户组:
      • 在流程设计的时候,可以通过assignee方式,直接分配给用户
        • 明确的分配给某用户/用户组:
          <task name="task1" assignee="username" > 这样直接把工作分配给该用户,这里只能是用户
        • 从环境变量来
          <task name="task1" assignee="#{user.userId}" > 这样直接把工作环境变量user对象的user的userId属性值所代表的用户
      • 在流程设计的时候,分配给一群用户 candidate-users
        <task name="task1" candidate-users="usernameA,usernameB,usernameC" >
      • 在流程设计的时候,分配给一群用户组 candidate-groups
        <task name="task1" candidate-groups="groupA,groupB,groupC" >
      • 在上述的2种方式:candidate-users、candidate-groups的方式,接收任务的人需要首先接收任务,才能进行处理,接收方式:taskService.takeTask
    • 在程序执行的时候,动态确定:
      这个在流程的xml中,也需要配置,到底哪个程序来确定。在Task节点中,需要配置任务分配器:
      <assignment-handler class="className">
      这个class是一个继承AssignmentHandler的类,只有一个方法:
      void assign(Assignable assignable, OpenExecution execution) throws Exception;
      Assignable是任务和泳道的通用接口。 所以任务分配处理器可以使用在任务, 也可以用在泳道中
      assignable:可以完成上述的3种添加完成任务用户的方法:assignee、candidate-users、candidate-groups
    • EL表达式
    <?xml version="1.0" encoding="UTF-8"?>
    
    <process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
    	<!-- EL表达式给assignee属性赋值 -->
       <task assignee="${user.userId}" g="406,144,92,52" name="任务A">
          <transition name="提交到任务B" to="任务B" g="-78,-17"/>
       </task>
       <task assignee="${user.userName}" g="412,259,92,52" name="任务B">
          <transition name="提交到任务C" to="任务C" g="-93,-12"/>
       </task>
       <task assignee="${user.userCode}" g="409,372,92,52" name="任务C">
          <transition name="通过" to="end1" g="-35,-8"/>
       </task>
       <start g="440,36,48,48" name="start1">
          <transition name="提交到任务A" to="任务A" g="-75,-19"/>
       </start>
       <end g="425,491,48,48" name="end1"/>
    </process>

            在上面的代码中会自动查找流程实例中user流程变量,根据该变量找到User实体对象,进而得到User对象的ID,即可完成,上一篇博客已经写了如何设置流程变量,这里就不再写重复代码。

            现在已经把任务与具体的用户关联到了一起,可以通过TaskService服务通过用户拿到相对应的任务信息、流程信息等,如下:
    	public void getTask() {
    		
    		//通过用户ID得到任务信息,如数量、名称、ID
    		List<Task> tasks=taskService.findPersonalTasks("001");
    		print("任务数量",tasks.size());
    		print("任务名称", tasks.get(0).getActivityName());
    		print("任务ID", tasks.get(0).getId());
    	}

              结果如下:



    • AssignHandler监听方式

    <?xml version="1.0" encoding="UTF-8"?>
    
    <process key="task" name="task" xmlns="http://jbpm.org/4.4/jpdl">
       <task  g="406,144,92,52" name="任务A">
       
       	  <!-- 设置监听的类,是哪一个类 -->
       	  <assignment-handler class="com.tgb.video.node.task.handler.AssignTask">
       	  </assignment-handler>
       	  
          <transition name="提交到任务B" to="任务B" g="-78,-17"/>
       </task>
       <task  g="412,259,92,52" name="任务B">
      	  <!-- 设置监听的类,是哪一个类 -->
          <assignment-handler class="com.tgb.video.node.task.handler.AssignTask1">
       	  </assignment-handler>
       	  
          <transition name="提交到任务C" to="任务C" g="-93,-12"/>
       </task>
       <task  g="409,372,92,52" name="任务C">
          <transition name="通过" to="end1" g="-35,-8"/>
       </task>
       <start g="440,36,48,48" name="start1">
          <transition name="提交到任务A" to="任务A" g="-75,-19"/>
       </start>
       <end g="425,491,48,48" name="end1"/>
    </process>

              这里边设置了一个监听属性,指定了监听类是哪一个,该类实现了一个AssignementHandler监听接口,当到达该任务时它会监听到并将用户信息设置到assignee属性上面,如下:

    public class AssignTask implements AssignmentHandler {
    
    	/**
    	 * 设置task的assignee属性
    	 */
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	public void assign(Assignable assignable, OpenExecution openExecution) throws Exception {
    		assignable.setAssignee("001");
    	}
    
    }



  • 相关阅读:
    java常用配置文件头部声明
    Error while launching application Error: spawn ENOMEM 解决
    Maven添加依赖后如何在IDEA中引用
    2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017)部分题解
    最小一乘法的一种数值算法?
    LOJ 6409. 「ICPC World Finals 2018」熊猫保护区
    min-max容斥复习
    BMCH
    大象
    关于高维卷积的一些不成熟的想法
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978542.html
Copyright © 2011-2022 走看看