Activiti BPMN 2.0 学习心得

更清晰的排版见  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用于将流程生命周期内发生的某些事情模型化 事件主要分为两种:

  1. Catching: 当流程执行到这类事件时会等待直到触发器执行
  2. 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>

```

抛出消息事件

抛出消息有两种情况

  1. 消息需要触发新的执行实例
  2. 消息需要被已经存在的执行实例接收

两种情况 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

时间: 2024-10-01 23:06:05

Activiti BPMN 2.0 学习心得的相关文章

Activiti BPMN 2.0 designer安装出错的解决方案

参看LemoOA的项目文档,下载Eclipse 的designer插件, 打开 Help -> Install New Software. 在如下面板中 , 点击 Add 按钮, 然后填入下列字段: Name: Activiti BPMN 2.0 designer Location: http://activiti.org/designer/update/ 今天准备学习下Activiti,但是安装Designer插件出错,解决办法,将下载出错的jar地址直接复制到迅雷下载,下载完成后放入%ECL

activiti工作流之Eclipse的Eclipse BPMN 2.0 Designer无法安装或者(安装后无法重复打开*.bpmn)

1.首先.既然学习activiti工作流,连官网和相应文件都没有下载就说不过去了 这是官网下载:http://www.activiti.org/download.html 2.对于下载后的activiti-5.17.0.zip的解压文件后,就很习惯去看docs/userguide/index.html 查找Chapter 12. Eclipse Designer 里面会叫如何安装Eclipse BPMN 2.0 Designer插件. Name: Activiti BPMN 2.0 design

在eclipse中设计BPMN 2.0工作流定义的根本步骤

原文地址:http://www.myexception.cn/eclipse/1863140.html 在eclipse中设计BPMN 2.0工作流定义的基本步骤 1. Activiti问我们提供了Activiti BPMN 2.0, 这个工具是基于Eclipse所开发的工具,安装十分方便.在安装Activiti之前,我们要首先安装Maven Eclipse插件. 点击Help -> Install New Software,输入以下站点信息: Name: M2ELocation: http:/

Liferay7 BPM门户开发之2: BPMN 2.0 开发入门 (Activiti BPMN extensions)

本文参考地址:http://activiti.org/userguide/index.html#bpmnConstructs BPMN 2.0中的重要概念: Events 事件 Sequence Flow 顺序流 Gateways 网关 Tasks 任务 Sub-Processes and Call Activities 子流程 Transactions and Concurrency 事务并发 Process Initiation Authorization 初始化认证 Data object

Linux系统理解以及Linux系统学习心得

原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 说一下我对Linux系统的理解 1.加载Linux内核准备:在加载基本输入输出模块(BIOS)之后,从磁盘的引导扇区读入操作系统的代码文件块到内存中,之后开始整个系统的初始化. 2.main.c的start_kernel函数是整个操作系统的入口,这也与Linux是基于C语言的特性相符,start_kernel具体做的动作很多

我的MYSQL学习心得(八)

我的MYSQL学习心得(八) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 这一篇<我的MYSQL学习心得(七)>将会讲解MYSQL的插入.更新和删除语句 同样的,只会讲解跟SQLSERVER不同的地方 插入 将多行查询结果插入到表中 语法 INSERT INTO table_name1(column_list1) SELECT (

Android学习心得(16) --- Dex文件结构实例解析(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下通过一个实例来分析dex文件结构和组成. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 参考baksmali工具使用Android学习心得(4) --- MAC下smali文件编写与运行 1.编译 我们通过一个例子来分析dex文件的构成 创建一个Hello.java文

Android Window PhoneWindow Activity学习心得--第三弹

Android Window  PhoneWindow Activity学习心得--第三弹 前面 我们完成了从Activity到PhoneWindow的整体跨度 正如我们所知道的与Activity组件关联的一个应用程序窗口视图对象关联一个ViewRoot对象,而将 一个Activity组件的应用程序窗口视图对象与一个ViewRoot对象关联是通过该Activity组件所使用的 窗口管理器(WindowManager)来执行的. 在我们初始化DecorView完成之后,我们需要关联应用程序窗口视图

Spreadsheet_Excel_Reader类学习心得

一:Spreadsheet_Excel_Reader类的基本使用方法: $reader=new Spreadsheet_Excel_Reader(); $reader->setOutputEncoding("GBK"); $reader->read($fileName); $rows=$reader->sheets[2]['numRows']; $cells=$reader->sheets[2]['cells']; 二:经常使用到的一些基本函数: 1>