SpringBoot整合Activiti工作流框架的使用
作者:MarlonBrando1998 发布时间:2022-03-02 12:32:44
Activiti 介绍
Activiti
是一个开源的工作流引擎,它实现了BPMN 2.0
规范,可以发布设计好的流程定义,并通过api
进行流程调度。Activiti
作为一个遵从Apache
许可的工作流和业务流程管理开源平台,其核心是基于Java
的超快速、超稳定的BPMN2.0
流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。简单来说
activiti
是一个业务流程管理引擎,会沿着设计者设计好的流程,一步一步的执行下去,直到终点。
SpringBoot 整合
配置
activiti
会框架会创建一系列的表,所以要配置相关数据库的信息,需要注意的是,在url
中,添加了针对数据库的条件,其中最后一条nullCatalogMeansCurrent=true
非常重要,至于有什么用就不概述了,但是没有这条语句的话就无法自动创建对应的二十八张表。
server:
port: 8014
spring:
application:
name: workflow
datasource:
name: mysqlDatasource
url: jdbc:mysql://localhost:3306/core?useUnicode=true&nullCatalogMeansCurrent=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 监控统计拦截的filters,如果启用log4j记得添加依赖
filters: stat,wall
# activiti
activiti:
#每次应用启动不检查Activiti数据表是否存在及版本号是否匹配,提升应用启动速度
database-schema-update: true
#在项目单独作为一个引擎,本身不部署流程的时候,如果resources目录没有“processes”目录,启动项目报错–找不到processes目录。需要在配置文件中添加以下内容:
check-process-definitions: false
process-definition-location-prefix: classpath:/processes/
process-definition-location-suffixes:
-**.bpmn
-**.bpmn20.xml
#保存历史数据级别设置为full最高级别,便于历史数据的追溯
history-level: full
# activiti 安全访问
security:
basic:
enabled: true
user:
name: root
password: root
版本问题
注意
SpringBoot
和Activiti
的版本问题springboot2.0
不能与activiti6.0.0
直接集成使用,因为activiti6.0.0
出来的时候springboot2.0
还没有出来,activiti6.0.0
支持springboot1.2.6
以上,2.0.0
以下的版本。
使用 starter
依赖
这个版本满足高版本的springboot
,直接使用就行
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M3.1</version>
</dependency>
需要注意的是,这里的依赖版本,需要对应数据库中act_ge_property
表中schema.version
版本信息,所以一般不建议在创建完表之后修改依赖信息
启动项目成功后自动创建表
需要在配置文件中加上 activiti-security
的配置
# activiti 安全访问
security:
basic:
enabled: true
user:
name: root
password: root
不使用 starter
依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
配置代码
@Configuration
public class ActivitiConfig {
private static final Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);
/**
* 配置分为以下几步骤
* 1. 创建ActivitiConfig
* 2. 使用ActivitiConfig创建ProcessEngineFactoryBean
* 3. 使用ProcessEngineFactoryBean创建ProcessEngine对象
* 4. 使用ProcessEngine对象创建需要的服务对象
*/
private final DataSource dataSource;
private final PlatformTransactionManager platformTransactionManager;
@Autowired
public ActivitiConfig(DataSource dataSource, PlatformTransactionManager transactionManager) {
this.dataSource = dataSource;
platformTransactionManager = transactionManager;
}
/*
* 1. 创建配置文件,也就是提供一些配置信息,这样就可以自定义自己的创建信息了
* 需要一些参数,1. 数据源。2. 事务管理器。
* 这里还加入了自动扫描process包下的bpmn(流程定义文件)的设置,这样就可以省去了部署
* */
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
spec.setDataSource(dataSource);
spec.setTransactionManager(platformTransactionManager);
spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
Resource[] resources = null;
// 启动自动部署流程
try {
resources = new PathMatchingResourcePatternResolver().getResources("classpath*:processes/*.*.xml");
} catch (IOException e) {
logger.error("Error Occur:", e);
}
spec.setDeploymentResources(resources);
return spec;
}
@Bean
public ProcessEngineFactoryBean processEngine() {
ProcessEngineFactoryBean engineFactoryBean = new ProcessEngineFactoryBean();
engineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());
return engineFactoryBean;
}
@Bean
public RepositoryService repositoryService() throws Exception {
return Objects.requireNonNull(processEngine().getObject()).getRepositoryService();
}
@Bean
public RuntimeService runtimeService() throws Exception {
return Objects.requireNonNull(processEngine().getObject()).getRuntimeService();
}
@Bean
public TaskService taskService() throws Exception {
return Objects.requireNonNull(processEngine().getObject()).getTaskService();
}
@Bean
public HistoryService historyService() throws Exception {
return Objects.requireNonNull(processEngine().getObject()).getHistoryService();
}
}
在resources
中创建process
文件夹,文件夹的路径和名字需要和ActivitiConfig
中的配置保持一致启动springBoot
项目即可创建完成
使用 Activiti
Idea
安装 Activiti BPMN visualizer
插件
编写测试 bpmn.xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="http://www.activiti.org/processdef">
<process id="test" name="test" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="HelloWorld" activiti:assignee="goxcheer"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_test">
<bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_test">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="41.0" x="220.0" y="180.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="640.0" y="180.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="261.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="640.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
编写测试代码
测试代码
@RequestMapping("/test")
@RestController
public class ActivitiTestController {
private static final Logger logger = LoggerFactory.getLogger(ActivitiTestController.class);
@Autowired
RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@RequestMapping("/test1")
public void test1() {
logger.info("Start.........");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("test");
logger.info("流程启动成功,流程id:{}", pi.getId());
}
@RequestMapping("/test2")
public void test2() {
String userId = "root";
List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey("test").taskCandidateOrAssigned(userId).list();
logger.info("任务列表:{}", resultTask);
}
}
…简单配置到此结束
完整配置代码见 :https://gitee.com/Marlon_Brando/onlineshop_back/tree/develop/os_workflow
来源:https://blog.csdn.net/qq_37248504/article/details/122992229
猜你喜欢
- 建造者模式(Builder Pattern)主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则
- 近期用到了一位师兄写的C++程序,总体功能良好。使用不同的数据测试,发现了一个明显的缺点:大数据量下,预处理过程耗时很长。中科院的某计算集群
- 用法一:常量在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个
- 文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以common
- mybatis-plus作为mybatis的增强工具,简化了开发中的数据库操作。一旦遇到left join或right join的左右连接,
- 本文介绍了Spring Security 控制授权的方法,分享给大家,具体如下:使用授权方法进行授权配置每一个 Spring Securit
- 1.例题题目描述迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标
- Springboot + Vue,定时任务调度的全套实现方案。这里用了quartz这个框架,实现分布式调度任务很不错,关于quarz的使用方
- 1.引入如下依赖<dependency> <groupId>org.spri
- 分析Github 3000个开源项目,粗略统计如下。括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整的请看完整列表。1.ja
- 前言在实际项目开发中,会碰到这样的问题,数据库表结构设计好了,可实体类还没相应地弄出来。实体类的属性命名方法一般是驼峰法,而数据库中的表字段
- 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或0
- 解决方法有如下两种:第一种如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/
- Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate、Mybatis等这些持久化支持。项目中用到了MyBatis,
- 由于要做一个新项目,所以打算做一个简单的图片验证码。先说说思路吧:在服务端,从一个文件夹里面找出8张图片,再把8张图片合并成一张大图,在8个
- 场景网站智能问答场景,需要对多个分类查询,结果聚合展示由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elastics
- 前言什么是mybatis二级缓存?二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace。即,在不同的s
- 简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理。早在JDK1.2的版本中就
- java 获取字节码文件的几种方法总结在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式,其具体思想及代码如下所示:pu
- 本文实例讲述了Android编程基于自定义View实现绚丽的圆形进度条功能。分享给大家供大家参考,具体如下:本文包含两个组件,首先上效果图: