本文详细介绍如何在Spring Boot项目中集成Activiti工作流引擎,包括:

  1. 添加Maven依赖
  2. 配置数据源和Activiti
  3. 创建流程定义
  4. 部署流程
  5. 启动流程实例
  6. 任务处理
  7. 完整示例代码

1. 添加Maven依赖

1
2
3
4
5
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>

2. 配置数据源和Activiti

1
2
3
4
5
6
7
8
9
10
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
activiti:
database-schema-update: true
history-level: full
async-executor-activate: true

3. 创建流程定义

创建一个简单的请假流程定义文件leave.bpmn20.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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:activiti="http://activiti.org/bpmn"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
id="definitions"
targetNamespace="Examples">

<process id="leaveProcess" name="请假流程">
<startEvent id="startEvent"/>

<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="leaveTask"/>

<userTask id="leaveTask" name="提交请假申请" activiti:assignee="${initiator}"/>

<sequenceFlow id="flow2" sourceRef="leaveTask" targetRef="approveTask"/>

<userTask id="approveTask" name="主管审批" activiti:candidateGroups="manager"/>

<sequenceFlow id="flow3" sourceRef="approveTask" targetRef="endEvent"/>

<endEvent id="endEvent"/>
</process>
</definitions>

4. 部署流程

创建流程部署服务类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Service
public class ProcessService {

@Autowired
private RepositoryService repositoryService;

@Autowired
private RuntimeService runtimeService;

@Autowired
private TaskService taskService;

public void deployProcess() {
String bpmnFilePath = "classpath:processes/leave.bpmn20.xml";
repositoryService.createDeployment()
.addClasspathResource(bpmnFilePath)
.name("请假流程")
.deploy();
}
}

5. 启动流程实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class ProcessInstanceService {

@Autowired
private RuntimeService runtimeService;

public String startProcess(String initiator) {
Map<String, Object> variables = new HashMap<>();
variables.put("initiator", initiator);

ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("leaveProcess", variables);

return processInstance.getId();
}
}

6. 任务处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Service
public class TaskService {

@Autowired
private org.activiti.engine.TaskService taskService;

public List<Task> getTasks(String assignee) {
return taskService.createTaskQuery()
.taskAssignee(assignee)
.list();
}

public void completeTask(String taskId, Map<String, Object> variables) {
taskService.complete(taskId, variables);
}
}

7. 完整示例代码

1. 创建实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class LeaveRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String initiator;
private String reason;
private LocalDate startDate;
private LocalDate endDate;
private String status;

// getters and setters
}

2. 创建控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@RestController
@RequestMapping("/process")
public class ProcessController {

@Autowired
private ProcessService processService;

@Autowired
private ProcessInstanceService processInstanceService;

@Autowired
private TaskService taskService;

@PostMapping("/start")
public ResponseEntity<String> startProcess(@RequestBody LeaveRequest request) {
String processInstanceId = processInstanceService.startProcess(request.getInitiator());
return ResponseEntity.ok(processInstanceId);
}

@GetMapping("/tasks")
public ResponseEntity<List<Task>> getTasks(@RequestParam String assignee) {
List<Task> tasks = taskService.getTasks(assignee);
return ResponseEntity.ok(tasks);
}

@PostMapping("/complete")
public ResponseEntity<Void> completeTask(@RequestParam String taskId,
@RequestBody Map<String, Object> variables) {
taskService.completeTask(taskId, variables);
return ResponseEntity.ok().build();
}
}

3. 配置类

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class ActivitiConfig {

@Autowired
private RepositoryService repositoryService;

@PostConstruct
public void init() {
// 部署流程定义
processService.deployProcess();
}
}

4. 应用程序主类

1
2
3
4
5
6
7
@SpringBootApplication
public class ActivitiDemoApplication {

public static void main(String[] args) {
SpringApplication.run(ActivitiDemoApplication.class, args);
}
}

使用示例

  1. 启动流程实例:
1
2
3
4
5
6
7
POST /process/start
{
"initiator": "张三",
"reason": "身体不适",
"startDate": "2025-04-16",
"endDate": "2025-04-17"
}
  1. 查询任务:
1
GET /process/tasks?assignee=张三
  1. 完成任务:
1
2
3
4
5
6
7
POST /process/complete
{
"taskId": "123",
"variables": {
"approval": "approved"
}
}

注意事项

  1. 确保数据库已正确配置并创建
  2. 流程定义文件需要放在resources/processes目录下
  3. 根据实际需求修改流程定义和业务逻辑
  4. 处理异常情况,添加适当的错误处理机制