文章目录
-
- 一. Activiti相关概念
- 1. Activiti介绍
- 2. 核心类
- 2.1 ProcessEngine
- 2.2 服务(Service)类
- 2.2.1 TaskService
- 2.2.2 RepositoryService
- 2.2.3 RuntimeService
- 2.2.3 HistoryService
- 2.3 CommandContextIntercepter或CommandExecutor
- 2.4 核心业务对象
- 3. 上下文组件(Context)
- 3.1 CommandContext
- 3.2 ProcessEngineConfigurationImpl
- 3.3 ExecutionContext
- 4. 持久化组件
- 5. Event-Listener组件
- 6. Cache组件
- 7. 异步执行组件
- 8. PVM:Process Virtal Machine
- 二. Eclipse插件安装:
- 三. 项目搭建
- 1. 新建Spring Boot工程
- 2. 引入Activiti相关依赖
- 3. 创建流程图
- 4. 启动工程
- 5. 修改配置
- 5.1 添加MySQL依赖
- 5.2 修改数据库
- 5.3 Activiti相关配置
- 5.4 附上application.yml完整配置:
- 5.5 启动工程
- 6. 编写实例
- 6.1 引入Thymeleaf依赖,(前端使用Thymeleaf的配置已经在application.yml中)
- 6.2 创建Controller控制器
- 6.3 流程跟踪与流程图展示
- 6.4 附上DemoController完整代码
- 7. 效果
- 一. Activiti相关概念
一. Activiti相关概念
1. Activiti介绍
Activiti是基于Apache许可的开源BPM平台,创始人Tom Baeyens原是JBPM架构师,可以理解为与JBPM出自同一祖师爷。它提供了Eclipse插件,开发可以通过插件直接绘制业务流程图。基于Spring,ibatis等框架,并在此之上构建了非常清晰的开发框架。是由Alfresco软件发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。 本文基于Activiti7的Activiti Core,基于Spring Boot做简单学习总结。(Activiti最新版本向微服务这边靠齐了,并分Activiti Core与Activiti Cloud两块,Activiti Cloud还没研究)
2. 核心类
2.1 ProcessEngine
流程引擎的抽象,可以通过此类获取需要的所有服务。
2.2 服务(Service)类
通过ProcessEngine获取,Activiti将不同生命周期的服务封装在不同Service中,包括定义、部署、运行。通过服务类可获取相关生命周期中的服务信息。
2.2.1 TaskService
流程运行过程中,每个任务节点的相关操作接口,如complete,delete,delegate等。
2.2.2 RepositoryService
流程定义和部署相关的存储服务。
2.2.3 RuntimeService
流程运行时相关的服务,如根据流程好启动流程实例startProcessInstanceByKey。
2.2.3 HistoryService
历史记录相关服务接口。
2.3 CommandContextIntercepter或CommandExecutor
Activiti使用命令模式作为基础开发模式,如Service中调用的各个方法都对应相应的命令对象。Service将请求委托给命令对象,命令对象来命令接受者,接受者接收后执行并返回结果。而CommandContextIntercepter的作用是拦截所有命令,并在命令前后执行一些公共方法。
2.4 核心业务对象
org.activiti.engine.impl.persistence.entity包下的类,包括Task,ProcessInstance,Execution等。会根据不同职责实现相应接口的方法(如需要持久化则继承PersistentObject接口),与传统的实体类不同。
3. 上下文组件(Context)
用来保存生命周期比较长,全局性的信息,类似Application,主要包括如下三类。
3.1 CommandContext
命令上下文,保存每个命令必要的资源,如持久化需要的session。
3.2 ProcessEngineConfigurationImpl
流程引擎相关配置信息,整个引擎全局的配置信息,如数据源DataSource等。该对象为单例,在流程引擎创建的时候初始化。
3.3 ExecutionContext
持有ExecutionEntity对象。
4. 持久化组件
Activiti使用ibatis作OR映射,并在此基础上增加设计了自己的持久化框架。在流程引擎创建时初始化。顶层接口Session、SessionFactory。Session有两个实现类:DbSqlSession,负责sql表达式的执行。AbstractManager负责对象的持久化操作。SessionFactory有两个实现类:DbSqlSessionFactory负责DbSqlSession相关操作,GenericManagerFactory负责AbstractManager相关操作。
5. Event-Listener组件
Activiti允许客户代码介入流程执行,提供了事件监听组件。监听的事件类型可以分为TaskListener、JavaDelegate、Expression、ExecutionListener。ProcessEngineConfigurationImpl持有DelegateInterceptor的某个实例,方便调用handleInvocation。
6. Cache组件
DbSqlSession中有cache的实现,Activiti基于List和Map来做缓存。如查询时先查缓存,没有则直接查询并放入缓存。
7. 异步执行组件
Activiti可以执行任务,JobExecutor为启核心类,JobExecutor包含三个主要属性:JobAcquisitionThread,BlockingQueue,ThreadPoolExecutor。方法ProcessEngines在引擎启动时调用JobExecutor.start,JobAcquisitionThread 线程即开始工作,其run方法不断循环执行AcquiredJobs中的job,执行一次后线程等待一定时间直到超时或者JobExecutor.jobWasAdded方法,因为有新任务而被调用。
8. PVM:Process Virtal Machine
流程虚拟机API暴露了流程虚拟机的POJO核心,流程虚拟机API描述了一个工作流流程必备的组件,这些组件包括:
PvmProcessDefinition:流程的定义,形象点说就是用户画的那个图。静态含义。
PvmProcessInstance:流程实例,用户发起的某个PvmProcessDefinition的一个实例,动态含义。
PvmActivity:流程中的一个节点
PvmTransition:衔接各个节点之间的路径,形象点说就是图中各个节点之间的连接线。
PvmEvent:流程执行过程中触发的事件
二. Eclipse插件安装:
我的Eclipse版本如下:
下载离线安装包(在线安装始终失败,应该出于网络限制),地址:http://www.activiti.org/designer/archived/activiti-designer-5.18.0.zip
离线安装包安装安装依然提示相关包找不到,于是下载另外三个依赖包(org.eclipse.emf.transaction_1.4.0.v20100331-1738.jar、org.eclipse.emf.validation_1.7.0.201306111341.jar、org.eclipse.emf.workspace_1.5.1.v20120328-0001.jar,在Maven仓库可以找到),放到Eclipse的plugin目录下,继续安装,如下:
确定后勾选相关选项,完成安装,重启Eclipse,New->Other
出现以上标志,则安装完成。
三. 项目搭建
1. 新建Spring Boot工程
(我的Eclipse已经安装Spring Boot插件)
然后Next->Next…->Finish即可,然后改application.properties为application.yml(个人习惯)
2. 引入Activiti相关依赖
在pom属性中定义版本号,并添加Activiti相关依赖:
<activiti-dependencies.version>7.0.56</activiti-dependencies.version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>${activiti-dependencies.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
</dependency>
由于Activiti默认使用H2数据库,所以需添加H2数据库支持(这里使用此SpringBoot版本默认1.4.197):
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
出现错误:Missing artifact org.activiti:activiti-spring-boot-starter:jar:7.0.56
添加私服仓库地址:
<repositories>
<repository>
<id>alfresco</id>
<name>Activiti Releases</name>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
错误消失。
3. 创建流程图
在此版本Activiti+SpringBoot,默认加载/processes/目录下流程,于是在resources下新建processes目录,并在目录下new->Other,如下:
使用Activiti图编辑工具打开,创建如下流程(创建过程在此不介绍,就是右侧工具栏的运用):
4. 启动工程
看日志:
从日志中可以看出,流程引擎已经默认创建,并可以看到使用的默认数据源是H2的数据源,我们创建的流程也已经部署。
5. 修改配置
在正常使用中,一般系统会有自己的数据库,而不会采用默认内存的H2数据库,这里以MySQL为例。修改application.yml。
5.1 添加MySQL依赖
<!--使用mysql数据库,导入mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
5.2 修改数据库
spring:
##数据库连接信息
datasource:
# 数据源配置
url: jdbc:mysql://127.0.0.1:3306/activity?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
# SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题
xa:
properties:
pinGlobalTxToPhysicalConnection: true
useServerPrepStmts: true
5.3 Activiti相关配置
# 参考配置https://www.cnblogs.com/liaojie970/p/8857710.html
activiti:
# 自动建表
database-schema: ACTIVITI
database-schema-update: true
history-level: full
db-history-used: true
注意:
database-schema-update表示启动时检查数据库表,不存在则创建
history-level表示哪种情况下使用历史表,这里配置为full表示全部记录历史,方便绘制流程图
db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示(暂未找到可行方式)
5.4 附上application.yml完整配置:
# 服务配置
server:
display-name: actdemo
port: 8085
# Spring相关配置
spring:
##数据库连接信息
datasource:
# 数据源配置
url: jdbc:mysql://127.0.0.1:3306/activity?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 888
driver-class-name: com.mysql.jdbc.Driver
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"># SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题</span></span></span></span>
xa:
properties:
pinGlobalTxToPhysicalConnection: true
useServerPrepStmts: true
thymeleaf:
mode: HTML
encoding: utf-8
# 禁用缓存
cache: false
application:
# 注册应用名
name: actdemo
mvc:
# 静态资源路径
static-path-pattern: /static/**
# 参考配置https://www.cnblogs.com/liaojie970/p/8857710.html
activiti:
# 自动建表
database-schema: ACTIVITI
database-schema-update: true
history-level: full
db-history-used: true
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"># SQLException: XAER_INVAL: Invalid arguments (or unsupported command)问题</span></span></span></span>
5.5 启动工程
观察日志,流程引擎已成功加载,并已使用MySQL数据库,如下:
再看数据库,已经创建25张表(老版本的Activiti创建表有手动执行SQL和通过调用流程引擎创建两种方式,该版本与SpringBoot整合后,启动默认创建需要的表):
注意:
原SpringBoot工程使用版本2.1.1.RELEASE,启动始终失败,各种错误,后改为2.0.4.RELEASE版本,则启动正常。
6. 编写实例
本例子使用Thymeleaf做前端页面展示(SpringBoot推荐使用),并创建控制器Controller调用工作流接口与前端交互。
6.1 引入Thymeleaf依赖,(前端使用Thymeleaf的配置已经在application.yml中)
<!-- Thymeleaf依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
6.2 创建Controller控制器
创建启动流程方法,主要代码如下
/**
* <p>启动请假流程</p>
* @return String 流程实例ID
* @author FRH
* @time 2018年12月10日上午11:03:36
* @ver