在本文中,我们将介绍如何将工作流引擎集成到 Spring Boot 应用程序中。我们将使用 Activiti 作为工作流引擎,它是一个基于 Java 语言的开源工作流引擎。本文假设您已经了解了Spring Boot和Activiti的基本概念。
一、创建一个Spring Boot项目
首先,我们需要创建一个新的 Spring Boot 项目。您可以使用 Spring Initializr 来生成一个基本的 Spring Boot 项目结构。选择以下依赖项:
- Web
- JPA
- H2
- Activiti
然后,导入生成的项目到您喜欢的IDE中。
二、配置Activiti
在 src/main/resources
目录下创建一个名为 activiti.cfg.xml
的配置文件,内容如下:
这个配置文件定义了 Activiti 引擎所需的一些基本配置。我们使用了 Spring 数据源和事务管理器来管理与数据库的连接。
接下来,我们需要在 application.properties
文件中配置数据库连接信息。由于我们使用 H2 内存数据库,所以只需添加以下内容即可:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
三、创建一个简单的工作流
我们将创建一个简单的工作流,用于员工请假申请。首先,在 src/main/resources/processes
目录下创建一个名为 leave.bpmn20.xml
的文件,内容如下:
Employee applies for leave
Manager approves or rejects leave
这个简单的工作流包含两个用户任务:员工申请请假(apply)和经理批准请假(approve)。我们使用 ${applicant}
和 managers
分别表示申请人和经理角色。
四、创建数据模型
为了处理员工的请假申请,我们需要创建一个 LeaveApplication
数据模型。在 src/main/java/com/example/workflow/model
目录下创建一个名为 LeaveApplication.java
的文件,内容如下:
package com.example.workflow.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class LeaveApplication {
@Id
@GeneratedValue
private Long id;
private String applicant;
private String reason;
private int days;
private String status;
// Getters and setters
// ...
}
这个实体类包含了请假申请的基本信息,如申请人、请假原因、请假天数和审批状态。
五、创建服务类
接下来,我们需要创建一个服务类来处理与工作流相关的操作。在 src/main/java/com/example/workflow/service
目录下创建一个名为 WorkflowService.java
的文件,内容如下:
package com.example.workflow.service;
import com.example.workflow.model.LeaveApplication;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class WorkflowService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
public String startProcess(LeaveApplication leaveApplication) {
Map variables = new HashMap();
variables.put("applicant", leaveApplication.getApplicant());
runtimeService.startProcessInstanceByKey("leave", variables);
return "Process started";
}
public List getTasks(String assignee) {
return taskService.createTaskQuery().taskAssignee(assignee).list();
}
public void completeTask(String taskId) {
taskService.complete(taskId);
}
}
在这个服务类中,我们注入了 Activiti 的 RuntimeService
和 TaskService
。startProcess
方法用于启动工作流,getTasks
用于获取指定用户的待办任务,completeTask
用于完成任务。
六、创建控制器
最后,我们需要创建一个控制器来处理 HTTP 请求。在 src/main/java/com/example/workflow/controller
目录下创建一个名为 WorkflowController.java
的文件,内容如下:
package com.example.workflow.controller;
import com.example.workflow.model.LeaveApplication;
import com.example.workflow.service.WorkflowService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class WorkflowController {
@Autowired
private WorkflowService workflowService;
@PostMapping("/start-process")
public String startProcess(@RequestBody LeaveApplication leaveApplication) {
return workflowService.startProcess(leaveApplication);
}
@GetMapping("/tasks/{assignee}")
public List getTasks(@PathVariable String assignee) {
return workflowService.getTasks(assignee);
}
@PostMapping("/complete-task/{taskId}")
public void completeTask(@PathVariable String taskId) {
workflowService.completeTask(taskId);
}
}
这个控制器包含三个 HTTP 端点,分别用于启动工作流、获取待办任务和完成任务。
至此,我们已经完成了 Spring Boot 项目中工作流的集成。您可以运行项目并使用 HTTP 客户端(如 Postman)测试 API。请注意,实际项目中可能需要处理更复杂的业务逻辑和错误处理。
总结
在本文中,我们介绍了如何将 Activiti 工作流引擎集成到 Spring Boot 项目中,并创建了一个简单的请假申请工作流。通过使用 Activiti,我们可以方便地管理业务流程和相关任务。希望本文能帮助您了解如何在 Spring Boot 项目中集成工作流。