配置(activiti配置实际上就是用spring加载的)
数据库或数据源的配置
采用mybatis处理
作业执行的配置
邮件服务的配置
历史配置
历史保存的粒度控制
表达式、脚本中beans的配置
单元测试
rule ActivitiRule
工作流虚拟机
流程的扭转都在这里处理,它里面也有一套模型
表达式
采用juel java unified expression language,jee6规范
它可以在Java服务任务、执行监听器、任务监听器、带条件的顺序流中使用
上下文
流程中的变量 +beans+内部变量execution(DelegateExecution)
表达式大体分两类:
值表达式
${pass} ${user.name}
方法表达式
${user.getName()}
${user.getName(var,execution)}
部署
部署一般流程中用的class不会被部署,这就要求运行流程的classpath中有对应的class
所以在流程中不要直接使用class,否则流程发布后,class就不能修改类名、包名,尽可能采用表达式的形式进行关联
如果没有对应的class,不影响部署流程,但在运行时会抛异常
流程定义版本
流程定义文件本身并没有版本的概念,在部署的时候程序动态添加的版本,在数据库中正在的id为:
流程ID+版本号+动态生成的ID
程序中默认获取最新版本的流程
BPMN2.0
它是业界对工作流的一种规范一种标准,Activiti 也是在遵循标准的前提下对它进行了扩展
这样你的工作流可以很容易的切换不同的供应商
Activiti 的BPMN2.0的扩展
1:同不同的命名空间进行区分
2:它仅对规范的实现方式进行扩展,并没有对规范新增内容,保证兼容性
这样activiti的所有实现都可以在bpmn2.0规范中得到等价的实现方式
事件分2类
捕获事件
流程执行的该事件时,会等待事件触发,图标中间是空的
抛出事件
流程执行的该事件时,事件就会被触发,图标中间有黑色填充物
定时器事件的定义
使用范围:start事件 等..
元素:
timeDate 在确切的时间触发
timeDuration 触发前持续时间
timeCycle 周期性的触发
开始事件
带定时的开始事件
触发器(定时器)自动触发
一般的开始事件
需要手动调用runtimeService.startProcessInstanceByKey来触发
结束事件
none end
事件结束无结果抛出,直接结束当前的执行路径
error end
顺序流
连接一个节点到另个节点,流上可以添加条件,如果有多条分支采用并行的形式处理
连接线中的表达式 结果必须是false或true,否则会抛异常
gateway
excluslve gateway 单一分支
多条分支默认只有一条可以走,如果有多条为true,仅跑第一个为true的通道
如果全部为false,则抛出异常
parallel gateway 并行分支
fork 并行执行所有输出的顺序流
join 所有到达parallet gateway的并发性的执行路径都等待与此,确保所有的输入流全部到达,才继续往下走
注:连线上的条件会被忽略
任务
用户任务
由人来参与处理
基本属性的指定
过期时间
用户分配
可以使用表达式
也可以有监听器代码动态的设置
脚本任务
脚本支持groovy、javascript
脚本中可以直接从上下文中使用变量,bean、内置变量,也可以操作
Java服务
直接调用外部的java类(实现:JavaDelegate)
部署是不会被实例化,第一次使用会加载,后期以单实例的方式处理
该类可以通过流程动态注入自动,从而与流程中的数据进行交互
高级: 实现ActivityBehavior 在内部可以直接操作流程虚拟机API,通过代码来控制流程的走向
WebService
调用一个WebService
业务规则任务
activiti这块采用drools作为规则引擎,流程中如果使用该节点要求在部署流程时,把规则文件.drl也一同部署
Email 任务
手动任务
跟Java服务的效果一样,使用场景应该都一样
Java接收任务
监听器
执行监听 (ExecutionListener)
执行外部代码或计算表达式,几乎任何流程中的环境都可以绑定到监听,还是非常灵活的并且还可以注入字段,
将流程中的数据塞到对象中
任务监听 TaskListener
任务监听不是BPMN规范,它是activiti专门针对用户任务进行的扩展
在流程部署的时候创建,单利的
多实例
说白了就是对某个任务多次执行,对它进行循环处理
子流程
直接在主流程中嵌套子流程或直接调用外部流程
内嵌中的流程,变量都是可见的
调用外部流程,变量需要做映射,将主流程中的变量映射到子流程,反过来也都可以
表单
内部表达、外部表单