技术交流28群

服务热线

135-6963-3175

微信服务号

activiti之任务元素 更新时间 2016-5-24 浏览1806次

任务是activiti三大元素之一,主要有

UserTask 人工任务

ScriptTask 服务任务

ServiceTask

MailTask

ManualTask

ReceiveTask

BusinessRuleTask

CallActivity

其中,UserTask用户任务最为常用。

1.用户任务 UserTask



public class UserTask extends Task {
  /**
   * 被分配到任务的人
   * (受理人):task任务的受理人,就是执行TASK的人,这个又分两种情况(有值,NULL)
   *    1),有值的情况:XML流程里面定义的受理人,TASK会直接填入这个人;
   *    2),NULL:XML没有指定受理人或者只指定了候选组;
   * 没有值的时候,可以使用签收功能去指定受理人,就是候选组里面谁签收谁就成了受理人
   */
  protected String assignee;
  //(委托人):受理人委托其他人操作该TASK的时候,受理人就成了委托人OWNER_,其他人就成了受理人ASSIGNEE_
  protected String owner;
  //指定用户任务的优先级,取值区间[0,100] TODO
  protected String priority;
  /*表单key*/
  protected String formKey;
  /*过期日期,通常用变量代替而不是设定一个具体的日期*/
  protected String dueDate;
  //可指定定时器,流程引擎配置中的业务日历的位置 TODO
  protected String businessCalendarName;
  //流程类别
  protected String category;
  //TODO
  protected String extensionId;
  /*
  * 所谓组任务,也就是任务的候选人,候选人中的用户有权认领该任务并且完成该任务,当任务被领取之后,其他候选人即无法再看到此任务。
    当用户认领任务时,就算该用户不在候选人列表中,依然可以认领任务
    * 可以指定多个用户
  * */
  protected List<String> candidateUsers = new ArrayList<String>();
  /**
   * 任务组,可以指定角色
   */
  protected List<String> candidateGroups = new ArrayList<String>();
  /*表单属性
  * */
  protected List<FormProperty> formProperties = new ArrayList<FormProperty>();
  protected List<ActivitiListener> taskListeners = new ArrayList<ActivitiListener>();
  /**
   * 跳过表达式
   * 如:我们在使用Activiti时经常会遇到提交人与审批人是同一个人的问题,这个时候我们就会用到Skip Expression
   * 需要开启支持跳过表达式 ActivitiConstanct.getSkipExpression()就是"_ACTIVITI_SKIP_EXPRESSION_ENABLED"
   *         variables.put(ActivitiConstanct.getSkipExpression(), true);
   */
  protected String skipExpression;
  /**
   *
   * 在实际业务中,我们系统可能初期并没有接入工作流,后期接入时就涉及到如何将现有业务表中的用户与Activiti进行对接
   * 1.通过继承UserEntityManager、GroupEntityManager
   * 2.自定义类CustomUserEntityManagerFactory实现SessionFactory接口
   * 3.在Activiti配置中注册自己定义的用户、用户组管理类:
   *    List<SessionFactory> customSessionFactories = new ArrayList<>();
   * customSessionFactories.add(customUserEntityManagerFactory);
   * customSessionFactories.add(customGroupEntityManagerFactory);
   *         processEngineConfiguration.setCustomSessionFactories(customSessionFactories);
   */
  //自定义用户身份
  protected Map<String, Set<String>> customUserIdentityLinks = new HashMap<String, Set<String>>();
  //自定义用户组
  protected Map<String, Set<String>> customGroupIdentityLinks = new HashMap<String, Set<String>>();
  /**
   * 用来存储我们的自定义属性
   * activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,
   * 它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的。
   */
  protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();

UI面板:

1643205426705.png

1.1General

1643205426138.png

1.2主面板配置

Asynchronous :  是否异步(默认否)表示是否能被异步执行。

Exclusive    :   是否排他(默认是)表示同一个流程实例在同一时刻只能由一个人执行该步骤, 跟asynchronous互斥。

is for compensation:是否补偿任务

1643205426319.png

skip expression:跳过表达式


1.3Listener

增加了Task Listeners

这里叫做任务监听器,和执行监听器大体相同,只是类实现的接口不同。

     注意:class需要实现接口

     org.activiti.engine.delegate.TaskListener


1.4Muti Instance

1643205427158.png

sequential是否串行

多实例优先于组任务


ManualTask

手工任务定义了BPM引擎外部的任务。 用来表示工作需要某人完成,而引擎不需要知道,也没有对应的系统和UI接口。

对于引擎,手工任务是直接通过的活动, 流程到达它之后会自动向下执行。

手动任务几乎不在程序中做什么事情,只是在流程的历史中留下一点痕迹,表明流程是走过某些节点的。而且这个任务是无法用taskservice查询到的。


ServiceTask

类型:mail\dmn\mule\camel\shell                                                                                      

mail:activiti强化了业务流程,支持了自动邮件任务,它可以发送邮件给一个或多个参与者, 包括支持cc, bcc, HTML内容等等。                    注意邮件任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)                                                                       

shell:shell任务可以执行shell脚本和命令。 注意shell任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)。                            mule:mule任务可以向mule发送消息,以强化activiti的集成能力。 注意mule任务不是BPMN 2.0规范定义的官方任务。 它也没有对应的图标)。                                 

camel:Camel任务可以从Camel发送和介绍消息,由此强化了activiti的集成功能。 注意camel任务不是BPMN 2.0规范定义的官方任务。 (它也没有对应的图标)                        

要使用camel任务功能时,也要记得吧activiti camel包含到项目里。       

public class ServiceTask extends TaskWithFieldExtensions {
  public static final String DMN_TASK = "dmn";
  public static final String MAIL_TASK = "mail";
  //class类全名或表达式
  protected String implementation;
  //实现类型 class\expression\delegate Expression\##WebService
  protected String implementationType;
  //结果变量名
  protected String resultVariableName;
  //类型:mail\dmn\mule\camel\shell
  //<serviceTask id="sendMail" activiti:type="mail">
  protected String type;
  protected String operationRef;
  protected String extensionId;
  /**
   * 用来存储我们的自定义属性
   * activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,
   * 它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的。
   */
  protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();
  //跳过表达式
  protected String skipExpression;
  ...

                                                            

ReceiveTask

接收任务是一个简单任务,它会等待对应消息的到达。                                                                   

<receiveTask id="waitState" name="wait" />

要在接收任务等待的流程实例继续执行, 可以调用runtimeService.signal(executionId),传递接收任务上流程的id。

ProcessInstance pi = runtimeService.startProcessInstanceByKey("receiveTask");              
Execution execution = runtimeService.createExecutionQuery()                                
  .processInstanceId(pi.getId())                                                           
  .activityId("waitState")                                                                 
  .singleResult();                                                                         
assertNotNull(execution);                                                                  
                                                                                          
runtimeService.signal(execution.getId());

ScriptTask

脚本任务时一个自动节点。当流程到达脚本任务, 会执行对应的脚本。                                                    

<scriptTask id="script" scriptFormat="groovy" activiti:autoStoreVariables="false">  
    <script>                                                                        
    sum = 0                                                                         
    for ( i in inputArray ) {                                                       
      sum += i                                                                      
    }                                                                               
  </script>                                                                         
</scriptTask>

注意:下面这些命名已被占用,不能用作变量名: out, out:print, lang:import, context, elcontext。             

public class ScriptTask extends Task {
  protected String scriptFormat;
  protected String script;
  protected String resultVariable;
  /**
   *  可以在脚本中自动保存任何变量。 (比如上例中的sum),只要把scriptTask 的autoStoreVariables属性设置为true。
   *  然而,最佳实践是不要用它,而是显示调用execution.setVariable(), 因为一些当前版本的JDK对于一些脚本语言,无法实现自动保存变量。
   *  参数默认为false,意思是如果没有为脚本任务定义设置参数, 所有声明的变量将只存在于脚本执行的阶段。
   *
   */
  protected boolean autoStoreVariables = false;
  ...

BusinessRuleTask


业务规则用户用来同步执行一个或多个规则。activiti使用drools规则引擎执行业务规则。                              

目前,包含业务规则的.drl文件必须和流程定义一起发布,流程定义里包含了执行这些规则的业务规则任务。                           

意味着流程使用的所有.drl文件都必须打包在流程BAR文件里,比如任务表单。                                                                                     

DefaultActivityBehaviorFactory.createBusinessRuleTaskActivityBehavior        

BusinessRuleTaskActivityBehavior                                             



public class BusinessRuleTask extends Task {
  //结果参数
  protected String resultVariableName;
  //可以配置为例外的规则:
  // 例:activiti:rules="rule1, rule2" exclude="true"  当exclude为true时,rule1,rule2规则不被执行。
  protected boolean exclude;
  //规则名称列表 activiti:rules="rule1,rule2"
  protected List<String> ruleNames = new ArrayList<String>();
  //输入参数
  protected List<String> inputVariables = new ArrayList<String>();
  //TODO
  //你想用不同方式使用drools,或你想使用完全不同的规则引擎, 你可以使用BusinessRuleTask上的class或表达式属性,它用起来就和 ServiceTask一样。
  //activiti:class="${MyRuleServiceDelegate}"
  protected String className;