更清晰的排版见 https://github.com/hauxsoft-java-group1/activiti/wiki
BPMN 2.0 结构
本文主要是对 官方文档 v 6.0.0 中对BPMN 2.0 结构介绍的翻译
类似文章有liujie037的 Activiti工作流学习-----基于5.19.0版本(7)
ps.明显能从ActivitiDesigner配置的内容,如每个组件的具体形状,在这里暂时就不赘述了
基础概念
Activiti对 BPMN 2.0 做了一些扩展,为其添加了一些自己的XML元素与属性,它们的命名空间都会有类似 activiti:***
的前缀,换句话说,有activiti:***
前缀的都是Activiti扩展的内容
Event 类型
Event用于将流程生命周期内发生的某些事情模型化 事件主要分为两种:
- Catching: 当流程执行到这类事件时会等待直到触发器执行
- Throwing: 当流程执行到这类事件时会触发触发器
两者的触发器都通过内部元素或xml文件配置
即一种是被动触发,一种是主动触发
Timer Event 类型
定时事件
BPMN 2.0 时间格式统一遵循 ISO 8601
标签 | 说明 | 示例 |
---|---|---|
timeDate | 触发触发器的时间 | 2011-03-11T12:13:14 |
timeDuration | 触发器被触发后运行前需要等待的时间 | P10D (10天) |
timeCycle | 设定重复间隔,支持多种格式 | R3/PT10H (重复3次,每次10小时) |
支持设置结束时间,如R3/PT10H/${"2015-02-25T16:42:11+00:00"}表示当到达EndDate后触发器停止工作 (待测试)
timeCycle标签也支持 cron 表达式, 如 0 0/5 * * * ? 表示每5分钟触发一次,可以在这里测试Cron表达式生成器
Error Event 类型
工作流程上的错误事件类型,与Java处理异常没有关系,
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="myError" />
</endEvent>
Signal Event 类型
Signal (信号) 是指作用于 全局域(global scope)且被 所有 激活的处理器(某些等待信号的执行实例或捕获信号的事件)接收的事件。
Signal 直接在根标签definitions标签下声明,与process标签同级,目前只能直接写在xml文件中,暂未发现用ActivitiDesigner如何声明
声明了Signal后可在相关组件处引用,这个ActivitiDesigner就支持了,xml配置大致如下:
```(xml)
<definitions... >
<!-- declaration of the signal -->
<signal id="alertSignal" name="alert" />
<process id="catchSignal">
<intermediateThrowEvent id="throwSignalEvent" name="Alert">
<!-- signal event definition -->
<signalEventDefinition signalRef="alertSignal" />
</intermediateThrowEvent>
...
<intermediateCatchEvent id="catchSignalEvent" name="On Alert">
<!-- signal event definition -->
<signalEventDefinition signalRef="alertSignal" />
</intermediateCatchEvent>
...
</process>
</definitions>
```
抛出信号事件
Signal可以被BPMN结构抛出,也可以调用java API抛出:
RuntimeService.signalEventReceived(String signalName);
RuntimeService.signalEventReceived(String signalName, String executionId); // 指定执行对象
查询信号事件(Signal Event)订阅情况
List<Execution> executions = runtimeService.createExecutionQuery()
.signalEventSubscriptionName("alert")
.list();
修改信号作用域
<signal id="alertSignal" name="alert" activiti:scope="processInstance"/>
activiti:scope 默认值为global
信号事件图例
Message Event 类型
信息事件,一个消息由名称与载荷组成,与信号事件不同,消息事件总是 只有一个接收者
与信号事件一样,在根标签definitions下声明
xml配置大致如下:
```(xml)
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples"
xmlns:tns="Examples">
<message id="newInvoice" name="newInvoiceMessage" />
<message id="payment" name="paymentMessage" />
<process id="invoiceProcess">
<startEvent id="messageStart" >
<messageEventDefinition messageRef="newInvoice" />
</startEvent>
...
<intermediateCatchEvent id="paymentEvt" >
<messageEventDefinition messageRef="payment" />
</intermediateCatchEvent>
...
</process>
</definitions>
```
抛出消息事件
抛出消息有两种情况
- 消息需要触发新的执行实例
- 消息需要被已经存在的执行实例接收
两种情况 runtime service 都提供了相应的方法处理
查询消息订阅情况
对于StartEvent的订阅,repository service 提供了相应的方法:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.messageEventSubscription("newCallCenterBooking")
.singleResult();
对于中间层的订阅,有如下方法可以查询:
Execution execution = runtimeService.createExecutionQuery()
.messageEventSubscriptionName("paymentReceived")
.variableValueEquals("orderId", message.getOrderId())
.singleResult();
消息事件图例
靠两种不同的消息来启动流程
Start Event 类型
流程开始的事件,总是处于等待被触发的状态
标签 | 说明 | 示例 |
---|---|---|
initiator | Activiti 扩展的属性,用于记录开始流程时权限用户(管理员)的ID |
initiator 需要通过如下方式设置:
try {
identityService.setAuthenticatedUserId("bono");
runtimeService.startProcessInstanceByKey("someProcessKey");
} finally {
identityService.setAuthenticatedUserId(null);
}
具体Event
None Start Event
不是由触发器触发的开始事件
就是ActivitiDesigner里的StartEvent
由如下方式触发ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();
标签 | 说明 | 示例 |
---|---|---|
formKey | Activiti扩展的属性,引用一个启动时需要填充的表单模板 |
Timer Start Event
定时开始事件,(定时 + 开始)事件
子流程不能有定时开始事件
当流程部署时就开始自动计时
当新流程部署时项目中旧流程的定时开始事件会被移除
详见 定时事件类型
Message Start Event
事件名称必须唯一,具体看文档... 部署新版本后旧版本会被取消
详见 消息事件类型
Signal Start Event
详见事件类型描述
Sequence Flow 顺序流程 (一对一)
Gateways 扩展流程 (一对多)(又称网关) Gateways
Task 任务
User Task
activiti:assignee
指定执行者
Sub-Processes and Call Activities
事务与并发
Forms
Activiti 内置隐式变量
All information relevant to a business process is either included in the process variables themselves or referenced through the process variables. Activiti supports complex Java objects to be stored as process variables like Serializable objects, JPA entities or whole XML documents as Strings.
Java处理异常
原文地址:https://www.cnblogs.com/dragonboom/p/9314557.html