本文详细介绍如何在Spring Boot项目中集成Activiti工作流引擎,包括:
- 添加Maven依赖
- 配置数据源和Activiti
- 创建流程定义
- 部署流程
- 启动流程实例
- 任务处理
- 完整示例代码
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; }
|
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 2 3 4 5 6 7
| POST /process/start { "initiator": "张三", "reason": "身体不适", "startDate": "2025-04-16", "endDate": "2025-04-17" }
|
- 查询任务:
1
| GET /process/tasks?assignee=张三
|
- 完成任务:
1 2 3 4 5 6 7
| POST /process/complete { "taskId": "123", "variables": { "approval": "approved" } }
|
注意事项
- 确保数据库已正确配置并创建
- 流程定义文件需要放在
resources/processes
目录下
- 根据实际需求修改流程定义和业务逻辑
- 处理异常情况,添加适当的错误处理机制