工作流引擎 Activiti 重要的 BPMN 2.0 元素

UserTask 用户任务

待完成。。。

ServiceTask 脚本任务

不同风格调用方式

使用 Spring Bean 调用

在 ServiceTask 的 Expression 属性中输入 Spring Bean 的名称、方法和参数等,execution 是 Activiti 内置的变量,用于获得流程引擎的上下文,money 为表单 Form 中对应的 ID 值。

#{exampleService.add(execution, money)}

生成的 bpmn.xml 内容为

<serviceTask id="SpringServiceTask" activiti:expression="#{exampleService.add(execution, money)}"/>  
使用 JavaDelegate 调用

在 ServiceTask 的 Class 属性中输入完整的类名(包含 Package),要求调用的类实现 org.activiti.engine.delegate.JavaDelegate 接口,并在execute 方法中提供对应的业务逻辑。

Exclusive Gateway 排他网关

排他网关定义了一组分支的唯一决策,所有流出的分支被按顺序评估,第一个条件被评估为true(当多个条件为true时,第一个决策被执行)的分支被执行,并且不再继续评估下面的分支。如果所有分支条件决策都为false且该网关定义了一个默认的连线,那么该默认分支将被执行。

Parallel Gateway 并行网关

并行网关用于无条件的拆分或合并分支,该类网关对连线条件是忽略的。

Inclusive Gateway 包含网关

包容网关是排他网关和并行网关的综合体。当进行决策判断时,与排他网关所不同的是,所有条件为true的后继分支都会被依次执行,如果所有分支条件决策都为false且该网关定义了一个默认的连线,那么该默认分支将被执行。

Intermediate Catching Events 中间捕获事件

Activiti 5.17 内置的流程编辑器中,添加 Intermediate Catching Events 或其它高级功能会出现以下错误:cvc-datatype-valid.1.2.1: '' 不是 'NCName' 的有效值。原因:编辑器生成的 signal 中的 ID 与 NAME 为空,且此内容无法在编辑器中修改。

当流程运行到 catching 节点时,流程会等待被触发,触发后流程继续运行。

RuntimeService.signalEventReceived(String executionId);  
RuntimeService.signalEventReceived(String signalName, String executionId);  
CallActivity 方式调用子流程

Activiti 共有两种方式可以调用子流程

  1. 使用编辑器,直接将子流程画到主流程中。此方法较适合制作简单的流程,且子流程不能被其它流程使用。
  2. 使用 CallActivity,可以将外部定义好的流程直接以子流程的方式调用。

CallActivity 关键属性

  1. Called element,调用子流程的 ProcessKey
  2. In parameters,传入流程变量的值
  3. Out parameters,子流程输出的流程变量
<callActivity id="CallSubProcess" name="调用子流程" calledElement="${ProcessKey}">  
<extensionElements>  
<activiti:in source="name" target="name"/>  
</extensionElements>  
</callActivity>  

ohfree9

继续阅读此作者的更多文章