❃博主首页 :
「程序员1970」
,同名公众号「程序员1970」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
一、环境准备
-
技术栈
- JDK 11+
- Spring Boot 2.7.x
- Flowable 6.8.0
- MySQL 8.0
-
依赖配置
在pom.xml中添加核心依赖:<dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Flowable Starter --> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.8.0</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> </dependencies>
二、数据库配置
在 application.yml 中配置 MySQL 连接:
spring:
datasource:
url: jdbc:mysql://localhost:3306/flowable?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: ***.mysql.cj.jdbc.Driver
flowable:
# 数据库表自动更新
database-schema-update: true
# 历史数据级别(full记录最完整)
history-level: full
# 关闭异步执行器(开发阶段)
async-executor-activate: false
三、流程定义与部署
-
设计 BPMN 流程
使用 [Flowable Modeler] (bpmn-js) 或在线工具设计请假流程,保存为leave-request.bpmn20.xml,结构:<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"> <process id="leaveProcess" name="请假流程"> <startEvent id="start" /> <userTask id="applyTask" name="提交申请" /> <exclusiveGateway id="decision" /> <userTask id="managerApproval" name="经理审批" /> <endEvent id="end" /> <sequenceFlow sourceRef="start" targetRef="applyTask" /> <sequenceFlow sourceRef="applyTask" targetRef="decision" /> <sequenceFlow sourceRef="decision" targetRef="managerApproval" conditionExpression="${days <= 3}" /> <sequenceFlow sourceRef="managerApproval" targetRef="end" /> </process> </definitions> -
部署流程
将 BPMN 文件放入src/main/resources/processes/目录,Spring Boot 启动时自动部署。或通过代码动态部署:@Autowired private RepositoryService repositoryService; public void deployProcess() { InputStream bpmnStream = new FileInputStream("path/to/leave-request.bpmn20.xml"); repositoryService.createDeployment() .addInputStream("leave-request.bpmn20.xml", bpmnStream) .deploy(); }
四、流程实例操作
-
启动流程实例
@Autowired private RuntimeService runtimeService; public String startProcess() { Map<String, Object> variables = new HashMap<>(); variables.put("days", 3); // 流程变量 ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess", variables); return instance.getId(); } -
查询与完成任务
@Autowired private TaskService taskService; public void ***pleteTask(String taskId) { Map<String, Object> variables = new HashMap<>(); variables.put("approved", true); taskService.***plete(taskId, variables); } public List<Task> getTasks(String assignee) { return taskService.createTaskQuery() .taskAssignee(assignee) .list(); }
五、动态任务分配
-
静态分配
在 BPMN 中直接指定执行人:<userTask id="managerApproval" name="经理审批" flowable:assignee="manager1" /> -
动态分配
通过表达式或 API 动态指定:// 在启动流程时设置变量 variables.put("nextApprover", "user123"); // 在BPMN中使用表达式 <userTask id="task" name="动态任务" flowable:assignee="${nextApprover}" />
六、历史数据查询
@Autowired
private HistoryService historyService;
public List<HistoricProcessInstance> getHistoryInstances() {
return historyService.createHistoricProcessInstanceQuery()
.finished()
.list();
}
public List<HistoricTaskInstance> getHistoryTasks(String processInstanceId) {
return historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.list();
}
七、扩展功能
-
会签任务
使用flowable:candidateUsers或flowable:candidateGroups实现多用户审批:<userTask id="***Approval" name="会签审批"> <documentation>需所有成员审批通过</documentation> <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="***List" flowable:elementVariable="***User"> <***pletionCondition>${nrOf***pletedInstances/nrOfInstances >= 1}</***pletionCondition> </multiInstanceLoopCharacteristics> </userTask> -
邮件通知
集成 Spring Mail,在任务分配时发送通知:@Autowired private JavaMailSender mailSender; public void sendNotification(String to, String taskId) { mailSender.send(new SimpleMailMessage() {{ setTo(to); setSubject("新任务待处理"); setText("您有新任务,ID: " + taskId); }}); }
八、Docker 部署
-
打包应用
mvn clean package -
构建 Docker 镜像
FROM openjdk:11-jre COPY target/flowable-demo.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] -
运行容器
docker build -t flowable-demo . docker run -d -p 8080:8080 --name flowable-app flowable-demo