Camunda 7 集成开发技术要点
Camunda 7 集成开发技术要点一、 核心纽带BusinessKey业务主键在 Camunda 与后端整合时BusinessKey是连接两者的“拉链”。操作逻辑保存业务数据先将业务单据如请假单存入业务表获取自增 ID 或雪花 ID如1001。启动流程调用runtimeService.startProcessInstanceByKey(Process_Key, 1001)。反向查询在审批界面通过 Task 获取processInstance进而拿到businessKey再去业务表查询详情。原则不要将大段业务数据存入流程变量只存 ID 和必要的审批判断参数。二、 三大核心 Java 控制类深度解析在 Spring Boot 环境下主要通过以下三类 Bean 来接管流程行为。1. JavaDelegate服务任务的执行者用于Service Task。这是项目中最常用的类负责处理“自动执行”的业务逻辑。使用场景调用外部接口、发送邮件、更新数据库状态、计算业务公式。代码实现Component(camundaPrint)// Bean 名称对应 Modeler 中的 Delegate ExpressionpublicclassCamundaPrintDelegateimplementsJavaDelegate{AutowiredprivateISysUserServiceuserService;// 可直接注入 Spring BeanOverridepublicvoidexecute(DelegateExecutionexecution)throwsException{StringbizKeyexecution.getProcessBusinessKey();// 业务逻辑...System.out.println(正在为业务 ID: bizKey 处理自动任务);}}Modeler 配置Implementation: 选择Delegate Expression。Delegate Expression: 填入${camundaPrint}。细节提示避免使用camunda:class因为那需要全路径类名且不支持 Spring 自动注入。2. TaskListener用户任务的监视器仅用于User Task人工审批节点。使用场景任务创建时发站内信、动态分配审批人Assignee、任务完成后校验审批意见。核心事件create人工任务刚产生。assignment任务分配给具体某人。complete审批人点击通过。代码实现Component(myTaskListener)publicclassMyTaskListenerimplementsTaskListener{Overridepublicvoidnotify(DelegateTaskdelegateTask){if(create.equals(delegateTask.getEventName())){// 给执行人发站内信StringassigneedelegateTask.getAssignee();}}}3. ExecutionListener流程生命周期的监控器最通用的监听器可以挂在流程的任何地方。使用场景打印节点流转 ID、在连线上执行逻辑、在 DMN 决策前准备数据、流程全局开始/结束记录。独特优势它可以挂在Sequence Flow连线上事件为take。代码案例为 DMN 准备数据Component(prepareDmnData)publicclassPrepareDmnDataListenerimplementsExecutionListener{Overridepublicvoidnotify(DelegateExecutionexecution){// 查库获取数据存入流程变量供 DMN 使用execution.setVariable(inputScore,95);}}三、 高级逻辑图形与代码的边界1. 排他网关 (Exclusive Gateway)图形逻辑决定流程走哪条线表达式${pass true}。代码职责在到达网关前的最后一个节点如 UserTask 的complete事件或之前的JavaDelegate或者直接挂 ExecutionListener 都行中通过setVariable存入pass变量。代码不参与路径计算只提供数据。2. DMN 决策表与 BusinessRuleTask设计哲学将复杂的if-else从 Java 代码中剥离。落地操作如果需要查库数据才能做决策在 DMN 节点的start事件挂一个ExecutionListener去查库并塞入变量。DMN 自动读取这些变量并输出结果。四、 项目组织架构与工程实践1. 目录结构建议org.dromara.workflow ├── delegate # 存放 JavaDelegate 实现类命名XxxDelegate ├── listener # 存放 TaskListener 和 ExecutionListener命名XxxListener ├── config # Camunda 引擎配置如 Spin 开启 JSON 支持 └── service # 对 Camunda 原生 Service 的二次封装2. 性能与日志优化 (P6Spy 屏蔽)Camunda 频繁轮询数据库会导致控制台 SQL 日志爆炸。操作在spy.properties中设置sqlexpression利用正则排除所有ACT_开头的表。sqlexpression^(?!(.*ACT_)).*3. 表达式选型优先使用Delegate Expression(${beanName})。原因支持 Spring 注入、方便维护、逻辑收敛在 JavaDelegate 类中。次要使用Expression(${myService.doSomething()})。原因适合简单的状态跳转或直接调用现有的业务 Service。五、 总结避坑黄金法则不要在 Delegate 里写死路径通过流程变量和 BusinessKey 保持 Delegate 的通用性。强制设置 TTL最好在 Modeler 中为每个流程设置History Time To Live否则在某些配置下无法部署。区分 Execution 与 Task操作“人”的逻辑进TaskListener操作“流程轨道”的进ExecutionListener。