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调用逻辑:
- 实现JavaDelegate或ActivityBehavior
- 执行解析代理对象的表达式
- 调用一个方法表达式
- 调用一直值表达式
执行一个在流程执行中调用的类, 需要在‘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(无参数), 会作用于名为split的bean上。 这个对象会被解析为流程对象和 (如果合适)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的种种的主要内容,如果未能解决你的问题,请参考以下文章