本文目录导读:

- 核心依赖与环境搭建
- 基于 Spring Boot 的自动配置(最推荐方式)
- 不使用 Spring Boot 的纯集成(例如 Spring MVC + XML)
- 关键集成点:如何让你的业务代码被流程调用?
- 前端集成(API 接口)
- 版本选择建议
Activiti 的集成通常分为架构集成(将引擎引入你的系统)和业务集成(将引擎能力与你的业务代码结合),根据你使用的框架和版本,集成方式有所不同。
以下是几种主流、详细的集成方案:
核心依赖与环境搭建
在 pom.xml(Maven)或 build.gradle(Gradle)中添加依赖。
-
Activiti 7 / 8.x (主流):核心依赖非常轻量。
<!-- Activiti 核心引擎 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> <!-- 或更新的版本 --> </dependency> <!-- 如果使用 DMN(决策表) --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-dmn-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency> <!-- 数据库驱动(以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> -
Activiti 5.x / 6.x (老项目):依赖方式类似,但包名为
org.activiti:activiti-spring-boot-starter-basic。
基于 Spring Boot 的自动配置(最推荐方式)
这是目前最简洁、最标准的方式,Activiti 团队已经做好了自动配置。
步骤:
-
添加依赖:如上所示。
-
配置
application.yml:spring: datasource: url: jdbc:mysql://localhost:3306/activiti_db?useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver activiti: # 自动部署 resources/processes/ 下的 bpmn 文件 # 设为 true 则启动时自动部署所有流程定义 auto-deploy: true # 数据库生成策略:true=启动时自动建表/更新表(开发环境) # false=不处理(生产环境使用手动脚本建表) database-schema-update: true # 历史等级:full=记录所有变量、表单等详细信息(生产环境建议 audit) history-level: full # 关闭 Spring Security 的默认认证(如果你有自己的安全体系) # activiti7 默认强制绑定 spring security,可通过此配置解耦 idm: enabled: false # 不允许自动生成图数据库(否则会尝试连 neo4j) # 如果不需要流程历史图的图形存储,可以关闭 entity-cache: enabled: false -
创建 BPMN 文件: 将你的
.bpmn20.xml文件放入src/main/resources/processes/目录下,启动项目时,Activiti 会自动扫描并部署。 -
注入核心服务:在业务代码中直接注入即可使用。
@Service public class MyWorkflowService { @Autowired private RuntimeService runtimeService; // 启动流程、查询、设置变量 @Autowired private TaskService taskService; // 处理用户任务 @Autowired private RepositoryService repositoryService; // 部署、查询流程定义 @Autowired private HistoryService historyService; // 查询历史数据 public void startProcess(String processKey, Map<String, Object> variables) { ProcessInstance instance = runtimeService .startProcessInstanceByKey(processKey, variables); System.out.println("流程启动,ID: " + instance.getId()); } public List<Task> getTasksForUser(String assignee) { return taskService.createTaskQuery() .taskAssignee(assignee) .list(); } }
不使用 Spring Boot 的纯集成(Spring MVC + XML)
如果你还在用比较老的传统 Spring MVC 项目(如 SSM),需要手动配置。
步骤:
-
添加依赖:同上。
-
创建
activiti-spring.xml:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="..."> <!-- 1. 数据源 --> <bean id="dataSource" class="..."> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> ... </bean> <!-- 2. 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 3. Activiti 流程引擎配置 --> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource"/> <property name="transactionManager" ref="transactionManager"/> <property name="databaseSchemaUpdate" value="true"/> <property name="historyLevel" value="full"/> <!-- 部署所有资源 --> <property name="deploymentResources" value="classpath*:processes/*.bpmn20.xml"/> </bean> <!-- 4. 流程引擎工厂 --> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration"/> </bean> <!-- 5. 暴露 Service (RuntimeService, TaskService 等) --> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> ... </beans>
关键集成点:如何让你的业务代码被流程调用?
Activiti 提供了多种“服务任务(Service Task)”与你的 Java 代码集成的方式:
JavaDelegate 接口(推荐)
// 1. 实现接口
@Component // 不需要额外配置,因为 Bean 名称就是类名首字母小写(如 myJavaDelegate)
public class MyJavaDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println("流程执行到我的业务方法了");
// 获取流程变量
String orderId = (String) execution.getVariable("orderId");
// 执行业务逻辑
doSomething(orderId);
// 设置输出变量
execution.setVariable("result", "success");
}
private void doSomething(String orderId) {
// 业务代码...
}
}
// 2. BPMN 文件中使用
// <serviceTask id="serviceTask1" activiti:delegateExpression="#{myJavaDelegate}"/>
@ActivityBean + 方法调用
// 1. 定义一个普通类
@Component
public class BusinessLogic {
// 方法签名:必须接收 DelegateExecution 参数或业务参数
public void handlePayment(DelegateExecution execution) {
// do something
}
}
// 2. BPMN 中引用
// <serviceTask id="paymentTask" activiti:expression="#{businessLogic.handlePayment(execution)}"/>
前端集成(API 接口)
Activiti 不包含丰富的默认前端,通常你需要自己写前端(Vue/React)来调用后端提供的 API。
- 官方提供的 REST API(
activiti-spring-boot-starter默认暴露):POST /runtime/process-instances启动流程GET /runtime/tasks查询任务POST /runtime/tasks/xxx/complete完成任务
- 自定义 API:通常建议封装一层,暴露给前端更友好的接口,而不是直接使用原生 Activiti API。
版本选择建议
- 新项目:直接选择 Activiti 7.x 及以上(有时也直接叫 Cloud Native 版本),集成简单,依赖少,不需要单独装数据库表初始化脚本。
- 老项目升级:注意从 5.x 到 7.x 有很多 API 变化(
TaskService中废弃了部分方法),建议逐步迁移。 - 区分 Activiti 与 Camunda:如果不需要 Activiti 的特定功能,Camunda 作为 Activiti 的 fork,生态更好、文档更丰富,集成方式几乎一模一样。
| 集成场景 | 推荐方案 | 关键点 |
|---|---|---|
| 新 Spring Boot 项目 | 添加 activiti-spring-boot-starter,配置 application.yml |
自动部署 BPMN、自动建表 |
| 老 Spring MVC 项目 | 手动配置 SpringProcessEngineConfiguration |
需要自己写 XML Bean 定义 |
| 业务解耦 | 使用 JavaDelegate 或 Expression |
流程与业务代码通过 Bean 名调用 |
| 前端交互 | 自定义 REST API 或使用 Activiti 原生 REST | 推荐自定义,更灵活 |
尝试按第一种方式集成,成功率最高,如果遇到具体报错(比如数据库连接、表不存在、Bean 冲突等),请提供错误信息,可以进一步分析。