Camunda 7工作流引擎核心API详解与Springboot集成实战配置指南
1. Camunda 7工作流引擎核心API解析第一次接触Camunda时我被它强大的API体系震撼到了。经过多个项目的实战验证我发现掌握这几个核心服务API就能搞定90%的业务流程需求。让我们从最常用的RuntimeService开始逐步拆解每个API的使用场景。RuntimeService就像工作流引擎的总开关负责流程实例的整个生命周期管理。我常用的是startProcessInstanceByKey方法它支持通过流程定义key快速启动实例。比如在OA审批场景中可以这样启动请假流程MapString, Object variables new HashMap(); variables.put(applicant, zhangsan); variables.put(days, 3); ProcessInstance instance runtimeService.startProcessInstanceByKey( leave_approval, variables );TaskService则是处理用户任务的核心。最近项目中遇到个典型场景需要查询某个用户待办任务并按创建时间排序。用TaskQuery可以轻松实现ListTask tasks taskService.createTaskQuery() .taskAssignee(lisi) .orderByTaskCreateTime() .desc() .list();HistoryService的价值经常被低估。有次排查流程卡顿问题就是靠它查到了历史记录HistoricProcessInstanceQuery query historyService .createHistoricProcessInstanceQuery() .processDefinitionKey(contract_approval) .unfinished(); ListHistoricProcessInstance instances query.list();RepositoryService管理流程定义和部署。记得有次热更新流程定义用到了这个方法Deployment deployment repositoryService.createDeployment() .addClasspathResource(processes/new_contract.bpmn) .deploy();2. Springboot集成完整配置指南集成Camunda到Springboot项目时我踩过不少坑。下面分享经过验证的配置方案帮你避开这些雷区。首先看pom.xml的关键依赖配置。建议使用camunda-bpm-spring-boot-starter这个starter包它能自动配置大部分beandependency groupIdorg.camunda.bpm.springboot/groupId artifactIdcamunda-bpm-spring-boot-starter/artifactId version7.18.0/version /dependencyapplication.yml的配置要特别注意数据库连接。我推荐单独为Camunda创建schemaspring: datasource: url: jdbc:mysql://localhost:3306/camunda?useSSLfalse username: camunda password: camunda driver-class-name: com.mysql.cj.jdbc.Driver camunda.bpm: admin-user: id: admin password: admin123自动生成的表结构中这几个表最常用ACT_RU_TASK运行时任务数据ACT_HI_TASKINST历史任务记录ACT_RE_PROCDEF流程定义信息3. 流程建模与部署实战使用Camunda Modeler设计流程时有些技巧能提升效率。比如设计OA审批流程时我通常会先用泳道图划分部门职责设置合理的网关条件为每个用户任务明确assignee保存为BPMN文件后部署到Springboot项目很简单。把文件放在resources/processes目录下启动时就会自动部署。也可以通过API动态部署Autowired private RepositoryService repositoryService; public void deployProcess(String bpmnPath) { Deployment deployment repositoryService.createDeployment() .addClasspathResource(bpmnPath) .name(OA审批流程) .deploy(); log.info(部署成功ID deployment.getId()); }4. 流程变量与任务处理技巧流程变量是工作流中的神经传导用好它能解决很多复杂场景。我总结了几种常用操作方式启动时设置变量MapString, Object vars new HashMap(); vars.put(approvalRequired, true); runtimeService.startProcessInstanceByKey(process, vars);任务完成时更新变量taskService.complete(taskId, Collections.singletonMap(approved, true));动态查询变量Object value runtimeService.getVariable( processInstanceId, key );处理用户任务时这几个API特别实用claim认领任务delegate委托任务setPriority设置优先级5. 高级功能与性能优化当流程复杂度上升时需要掌握一些高级技巧。比如使用Delegate Expression实现服务任务Bean(approvalHandler) public JavaDelegate approvalHandler() { return execution - { String processId execution.getProcessInstanceId(); // 业务逻辑处理 }; }性能优化方面我总结了几点经验批量查询时使用分页ListTask tasks taskService.createTaskQuery() .listPage(0, 100);历史数据定期归档复杂查询添加索引监听器的使用场景也很广泛。比如需要在任务创建时发送通知Bean public TaskListener notificationListener() { return delegateTask - { String assignee delegateTask.getAssignee(); // 发送通知逻辑 }; }6. 常见问题排查指南在实际项目中我遇到过几个典型问题问题1流程实例卡住不动检查网关条件表达式查看ACT_RU_TASK表是否有对应任务确认服务任务是否抛出异常问题2变量获取为null检查变量作用域流程/任务确认变量名拼写正确查看ACT_RU_VARIABLE表记录问题3流程定义不更新清理ACT_GE_BYTEARRAY表重启应用时检查部署日志调试时可以开启DEBUG日志logging: level: org.camunda: DEBUG7. 完整OA审批案例实现结合前面内容我们实现一个完整的请假审批流程流程定义leave_approval.bpmn开始事件 → 申请人填写 → 部门审批 → 人事备案 → 结束事件启动流程public String applyLeave(String userId, int days) { MapString, Object vars new HashMap(); vars.put(applicant, userId); vars.put(days, days); ProcessInstance instance runtimeService .startProcessInstanceByKey(leave_approval, vars); return instance.getId(); }审批处理public void approveLeave(String taskId, boolean approved) { MapString, Object vars new HashMap(); vars.put(approved, approved); taskService.complete(taskId, vars); }查询待办public ListTask getPendingTasks(String userId) { return taskService.createTaskQuery() .taskAssignee(userId) .list(); }