在 Spring Boot 项目中集成 Activiti 来实现工作流管理是一个常见的需求,Activiti 是一个强大的工作流引擎,支持 BPMN 2.0 标准,适用于复杂的工作流管理、自动化任务、审批流程等。
下面是如何在 Spring Boot 项目中使用 Activiti 的详细步骤:
1. 引入依赖
在你的 pom.xml
中添加 Activiti 的相关依赖。Activiti 提供了多个模块,你可以选择合适的模块:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Activiti Spring Boot Starter -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version> <!-- 使用合适的版本 -->
</dependency>
<!-- Activiti Spring Boot Data JPA Starter (用于持久化数据库) -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-data-jpa</artifactId>
<version>7.1.0.M6</version> <!-- 使用合适的版本 -->
</dependency>
<!-- Database Dependencies for JPA (如 H2, MySQL, PostgreSQL 等) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- H2 Database (可选,用于开发测试) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2. 配置数据库连接
配置你的数据库连接(例如 H2、MySQL 或 PostgreSQL)。在 application.properties
或 application.yml
中配置数据源。
# 数据库配置
spring.datasource.url=jdbc:h2:mem:activiti;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
# JPA 配置
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
# Activiti 配置
activiti.database-schema-update=true
如果使用 MySQL,修改为 MySQL 的相关配置,并确保数据库连接是有效的。
3. 配置 Spring Boot 启动类
在你的 @SpringBootApplication
启动类中,启用 Activiti 的配置。
import org.activiti.spring.boot.ProcessEngineAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@Import(ProcessEngineAutoConfiguration.class)
public class WorkflowApplication {
public static void main(String[] args) {
SpringApplication.run(WorkflowApplication.class, args);
}
}
4. 创建 BPMN 流程定义文件
Activiti 使用 BPMN 2.0 规范来定义流程。你可以在资源文件夹(src/main/resources
)下创建一个 processes
文件夹,并在其中定义 BPMN 文件。
<?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"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
id="Process_1" targetNamespace="http://activiti.org/bpmn">
<process id="myProcess" name="My Process" isExecutable="true">
<startEvent id="startEvent" name="Start"></startEvent>
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="endEvent"></sequenceFlow>
<endEvent id="endEvent" name="End"></endEvent>
</process>
</definitions>
将该 BPMN 文件命名为 my_process.bpmn20.xml
并存放到 src/main/resources/processes/
目录下。
5. 启动流程引擎
在 Spring Boot 启动时,Activiti 会自动加载并创建数据库表格(如流程定义、历史记录、任务等)。通过创建工作流实例来启动流程。
6. 创建服务类管理工作流
你需要一个服务类来管理工作流的启动、任务分配等操作。
import org.activiti.bpmn.model.Process;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class WorkflowService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
// 启动流程实例
public void startProcess() {
runtimeService.startProcessInstanceByKey("myProcess");
}
// 获取任务列表
public List<Task> getTasks() {
return taskService.createTaskQuery().list();
}
// 完成任务
public void completeTask(String taskId) {
taskService.complete(taskId);
}
}
7. 创建控制器
创建一个控制器,用来触发流程操作,比如启动流程、查询任务、完成任务等。
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/workflow")
public class WorkflowController {
@Autowired
private WorkflowService workflowService;
// 启动流程
@PostMapping("/start")
public String startProcess() {
workflowService.startProcess();
return "Process started successfully";
}
// 获取任务列表
@GetMapping("/tasks")
public List<Task> getTasks() {
return workflowService.getTasks();
}
// 完成任务
@PostMapping("/complete/{taskId}")
public String completeTask(@PathVariable String taskId) {
workflowService.completeTask(taskId);
return "Task completed successfully";
}
}
8. 测试流程
启动 Spring Boot 项目后,你可以通过以下接口测试流程操作:
- 启动流程:
POST /workflow/start
- 查看任务:
GET /workflow/tasks
- 完成任务:
POST /workflow/complete/{taskId}
9. 可视化工作流(可选)
如果你希望能够在 UI 上查看工作流状态,可以使用 Activiti Admin 或 Flowable 提供的 Web UI 工具,或者自定义开发一个 Web 页面,利用 Activiti 提供的 API 查询和展示流程实例、任务等信息。
10. 进阶:流程变量与任务分配
你可以在启动流程时传递流程变量,也可以在任务完成时更新变量。在 runtimeService.startProcessInstanceByKey
中传递变量:
runtimeService.startProcessInstanceByKey("myProcess",
Collections.singletonMap("someVariable", "someValue"));
此外,可以使用 Activiti 的任务分配功能,向用户分配任务。可以通过 taskService.claim(taskId, userId)
将任务分配给某个用户。
总结
通过以上步骤,你可以在 Spring Boot 项目中集成 Activiti,并实现基本的工作流管理,包括启动流程、查询任务、完成任务等功能。你可以进一步扩展它的功能,例如增加任务分配、流程监控、历史数据查询等。