Activiti笔记——有关Task的种种

Posted Go_uP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activiti笔记——有关Task的种种相关的知识,希望对你有一定的参考价值。

1.BPMN2.0

1)XML内容

业务流程的XML内容大致可以包含以下几个方面

  • (空)开始事件是我们流程的入口
  • 用户任务(User Task)是流程中与操作者相关的任务声明,用户任务用来设置必须由人员完成的工作。 当流程执行到用户任务,会创建一个新任务, 并把这个新任务加入到分配人或群组的任务列表中。 

    图像表示:

         技术分享

  • 脚本任务(Script Task)Java服务任务用来调用外部java类。

    图像表示:

    技术分享

  • Java服务任务(Service Task)时一个自动节点。当流程到达脚本任务, 会执行对应的脚本。 

    图像表示:

    技术分享

  • 手工任务(Mannual Task)手工任务定义了BPM引擎外部的任务。 用来表示工作需要某人完成,而引擎不需要知道,也没有对应的系统和UI接口。 对于引擎,手工任务是直接通过的活动, 流程到达它之后会自动向下执行。 

    图像表示:

    技术分享

 
  • 当流程达到空结束事件就会结束。
  • 这些元素都使用连线连接。 这些连线拥有source 和 target属性, 定义了连线的方向

2.有关ServiceTask

1)有4钟方法来声明java调用逻辑:

  • 实现JavaDelegateActivityBehavior
  • 执行解析代理对象的表达式
  • 调用一个方法表达式
  • 调用一直值表达式

执行一个在流程执行中调用的类, 需要在‘activiti:class‘属性中设置全类名。

 

<serviceTask id="javaService"
             name="My Java Service Task"
             activiti:class="org.activiti.MyJavaDelegate" />

也可以使用表达式调用一个对象。对象必须遵循一些规则, 并使用activiti:class属性进行创建。 

<serviceTask id="serviceTask" activiti:delegateExpression="${delegateExpressionBean}" />

这里,delegateExpressionBean是一个实现了JavaDelegate接口的bean, 它定义在实例的spring容器中。

要指定执行的UEL方法表达式, 需要使用activiti:expression

<serviceTask id="javaService"
             name="My Java Service Task"
             activiti:expression="#{printer.printMessage()}" />

方法printMessage(无参数)会调用 名为printer对象的方法。

也可以为表达式中的方法传递参数。

<serviceTask id="javaService"
             name="My Java Service Task"
             activiti:expression="#{printer.printMessage(execution, myVar)}" />

这会调用名为printer对象上的方法printMessage 第一个参数是DelegateExecution,在表达式环境中默认名称为execution 第二个参数传递的是当前流程的名为myVar的变量。

要指定执行的UEL值表达式, 需要使用activiti:expression属性。

<serviceTask id="javaService"
             name="My Java Service Task"
             activiti:expression="#{split.ready}" />

ready属性的getter方法,getReady(无参数), 会作用于名为splitbean上。 这个对象会被解析为流程对象和 (如果合适)spring环境中的对象。

实现

要在流程执行中实现一个调用的类,这个类需要实现org.activiti.engine.delegate.JavaDelegate接口, 并在execute方法中提供对应的业务逻辑。 当流程执行到特定阶段,它会指定方法中定义好的业务逻辑, 并按照默认BPMN 2.0中的方式离开节点。

让我们创建一个java类的例子,它可以流程变量中字符串转换为大写。 这个类需要实现org.activiti.engine.delegate.JavaDelegate接口, 这要求我们实现execute(DelegateExecution)方法。 它包含的业务逻辑会被引擎调用。流程实例信息,如流程变量和其他信息, 可以通过 DelegateExecution 接口访问和操作

public class ToUppercase implements JavaDelegate {

  public void execute(DelegateExecution execution) throws Exception {
    String var = (String) execution.getVariable("input");
    var = var.toUpperCase();
    execution.setVariable("input", var);
  }

}

注意:serviceTask定义的class只会创建一个java类的实例 所有流程实例都会共享相同的类实例,并调用execute(DelegateExecution) 这意味着,类不能使用任何成员变量,必须是线程安全的,它必须能模拟在不同线程中执行。 这也影响着属性注入的处理方式。

流程定义中引用的类(比如,使用activiti:class不会 在部署时实例化。只有当流程第一次执行到使用类的时候, 类的实例才会被创建。如果找不到类,会抛出一个ActivitiException 这个原因是部署环境(更确切是的classpath)和真实环境往往是不同的。 比如当使用ant或业务归档上传到Activiti Explorer来发布流程 classpath没有包含引用的类。

<activiti:string>标签和<activiti:expression>标签

activiti:resultVariable用于表示返回值

<serviceTask id="aMethodExpressionServiceTask"
    activiti:expression="#{myService.doSomething()}"
    activiti:resultVariable="myVar" />

3.task.Task的执行过程

假设是一个UserTask,

task.Task的execute()会

调用它的activityBehavior.execute(execution);

UserTaskActivityBehavior.execute()会根据TaskDefinition构造Task对象

注意这个过程中,会对Task的受托人、候选组、候选用户等Expression进行getValue()的计算

最后,Task的信息保存入库

以上是关于Activiti笔记——有关Task的种种的主要内容,如果未能解决你的问题,请参考以下文章

膨胀类片段时出错

Activiti工作流引擎基础入门收藏可做笔记系列

activiti工作流任务(task)的查询

activiti task怎么区别类型

Activiti task claim

activiti 流程定义表怎么得到部署id