文章目录
Activiti7的进阶使用
1.idea安装插件
1.1 Activiti BPMN visualizer
1.2 测试是否能正常使用
1.3 右键选择此BPMN.xml文件
1.4 成功
2.Maven
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<activiti.version>7.1.0.M6</activiti.version>
</properties>
<dependencies>
<!--activiti 相关包-->
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-engine -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 模型处理 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn json数据转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 布局 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- activiti 云支持 -->
<!-- https://mvnrepository.com/artifact/org.activiti.cloud/activiti-cloud-services-api -->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- 链接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
3.配置文件Xml(最好默认名称)
目录结构
activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--dbcp链接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activiti7?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
</bean>
<!--在默认方式下 bean的id 固定为 processEngineConfiguration-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--配置数据库相关的信息-->
<!--数据库驱动
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>-->
<!--数据库链接
<property name="jdbcUrl" value="jdbc:mysql:///activiti"/>-->
<!--数据库用户名
<property name="jdbcUsername" value="root"/>-->
<!--数据库密码
<property name="jdbcPassword" value="123456"/>-->
<!--直接引用上面配置的链接池-->
<property name="dataSource" ref="dataSource"/>
<!--activiti数据库表在生成时的策略
true - 如果数据库中已经存在相应的表,那么直接使用,
如果不存在,那么会创建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#日志文件位置
log4j.appender.LOGFILE.File=D:\\Test\\java\\Test1\\activiti7\\src\\main\\resources\\log\\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
4.创建数据库
4.1 创建新的空数据库
根据 activiti.cfg.xml 文件中所连接的数据库名字创建一个新的空数据库
4.2 建表
4.2.1 创建流程图
此处流程图名会在数据库的 act-re-procdef 表中作为唯一Key标识
- 右键选择图标
- 选中图标修修改信息,如下
修改Name等信息
- 点击图标,拖动右上角的箭头,将他们之间的关系连接起来
- 右键,save to PNG,将png文件保存下来方便日后查看
4.2.2 创建表的两种方式
单个流程的创建
/**
* 测试流程部署
*/
@Test
public void testDeployment() {
//1.创建 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.使用RepositoryService进行部署,将bpmn文件和生成的png文件路径放入其中
Deployment deploy = repositoryService.createDeployment().name("出差申请流程").addClasspathResource("bpmn/evection.bpmn20.xml").addClasspathResource("bpmn/evection.png").deploy();
//4.输出部署信息
System.out.println("流程部署ID=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
通过ZIP压缩包一次性创建多个流程
目录结构
/**
* 使用zip包进行批量部署
*/
@Test
public void deployProcessByZip() {
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程部署
//读取资源包文件构造成inputStream
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("bpmn/evection.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("流程部署ID" + deploy.getId());
System.out.println("流程部署名称" + deploy.getName());
}
可以看到 act-re-procdef 表中已经有了两个流程
ps1: 上面的是默认创建方式,activiti.cfg.xml文件名及路径固定,且activiti.cfg.xml文件中有 processEngineConfiguration的配置
.
ps2: 一般创建方式如下
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
4.3 Service总览
部署操作表
act-re-deployment 部署表
act-re-procdef 流程定义表
act-ge-bytearray 资源表
service名称 | service作用 |
---|---|
RepositoryService | activiti的资源管理类 |
RuntimeService | activiti的流程运行管理类 |
TaskService | activiti的任务管理类 |
HistoryService | activiti的历史管理类 |
ManagerService | activiti的引擎管理类 |
简单介绍:
.
RepositoryService是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。
暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
.
RuntimeServiceActiviti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
.
TaskServiceActiviti的任务管理类。可以从这个类中获取任务的信息。
.
HistoryServiceActiviti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,
完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
.
ManagementServiceActiviti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于
Activiti 系统的日常维护。
5.简单测试使用
5.1 启动流程实列(根据Key值来启动)
核心
ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");
/**
* 启动流程实例
*
* @`act_hi_actinst` 流程实例执行历史信息
* @`act_hi_identitylink` 流程参与用户的历史信息
* @`act_hi_procinst` 流程实例的历史信息
* @`act_hi_taskinst` 流程任务的历史信息
* @`act_ru_execution` 流程执行信息
* @`act_ru_identitylink` 流程的正在参与用户信息
* @`act_ru_task` 流程当前任务信息
*/
@Test
public void testStartProcess() {
//1.创建 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取runTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.根据流程定义 Key 的启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");
//4.输出内容
System.out.println("流程定义ID=" + instance.getProcessDefinitionId());
System.out.println("流程实列ID=" + instance.getId());
System.out.println("当前活动的ID=" + instance.getActivityId());
}
5.2 任务查询 (根据流程定义的Key和负责人来进行查询)
核心 (taskAssignee是画图的时候Assignee所填写的内容,正常为负责人名称)
taskService.createTaskQuery() .processDefinitionKey("Test2") .taskAssignee("第一个节点") .list();
/**
* 查询个人待执行的任务
*/
@Test
public void testFindPersonalTaskList() {
//1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取taskService
TaskService taskService = processEngine.getTaskService();
//3、根据流程key 和 任务的负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("Test2")
.taskAssignee("第一个节点")
.list();
//4、输出
for (Task task : list) {
System.out.println("流程定义ID=" + task.getProcessInstanceId());
System.out.println("任务ID=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
}
}
/*
流程定义ID=2501
任务ID=2505
任务负责人=第一个节点
任务名称=这个是Test2的第一个节点
*/
5.3 任务的完成
核心 (使用TaskService,用任务ID来完成,任务id见上方 task.getId() )
taskService.complete("2505");
流程图
表 act_ru_task
任务第一步执行之前(启动流程实例)
5.3.1 执行第一次
/**
* 完成个人任务
*/
@Test
public void completTask() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//完成任务,参数:任务id,完成 >第一个节点< 的任务
taskService.complete("2505");
}
任务第一步执行之后,第二步执行之前
5.3.2 执行第二次
通过任务查询 createTaskQuery 获取 ( 任务查询 createTaskQuery)
/**
* 完成个人任务
*/
@Test
public void completTask() {
//获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
//获取 Test2 - 第一个节点 对应的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("Test2")
.taskAssignee("第二个节点")
.singleResult();
//完成 >第二个节点< 的任务
taskService.complete(task.getId());
}
任务第二步执行之后,因为流程结束,所以此表删除这个任务实例