前置说明
所有配置都在 Camunda Modeler 中完成:选中 Service Task 节点 → 右侧属性面板 → Implementation 下拉框选择对应类型 → 在下方的输入框(如 Java Class、Expression 等)填写内容。
本文详细介绍了 Camunda 工作流引擎中 Service Task 的五种实现方式:External、Java class、Expression、Delegate expression 和 Connector。涵盖配置规则、代码示例及适用场景。建议日常开发优先使用 Delegate expression 以适配 Spring 依赖注入,耗时任务选用 External 解耦流程引擎,无代码集成场景使用 Connector。
所有配置都在 Camunda Modeler 中完成:选中 Service Task 节点 → 右侧属性面板 → Implementation 下拉框选择对应类型 → 在下方的输入框(如 Java Class、Expression 等)填写内容。
ExternalR3/PT5M 表示重试 3 次,每次间隔 5 分钟)leave_approval_check(请假审批校验)、order_payment_process(订单支付处理)R5/PT1M(重试 5 次,每次间隔 1 分钟)import org.camunda.bpm.client.ExternalTaskClient;
public class LeaveApprovalWorker {
public static void main(String[] args) {
// 创建外部任务客户端
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest") // Camunda REST 接口地址
.asyncResponseTimeout(10000) // 异步响应超时时间
.build();
// 订阅 Topic(必须和 Modeler 中填写的 Topic 一致)
client.subscribe("leave_approval_check")
.lockDuration(60000) // 锁时长(60 秒,防止其他 Worker 重复处理)
.handler((externalTask, externalTaskService) -> {
// 1. 获取流程变量
String applicant = (String) externalTask.getVariable("applicant");
Integer leaveDays = (Integer) externalTask.getVariable("leaveDays");
// 2. 执行业务逻辑
boolean approve = leaveDays <= 3;
// 3. 设置输出变量
externalTaskService.complete(externalTask, Map.of("approveResult", approve));
})
.open();
// 启动 Worker
}
}
Java classorg.camunda.bpm.engine.delegate.JavaDelegate 接口@Component 或手动注册到 Spring 容器)com.example.camunda.service.LeaveApprovalServicepackage com.example.camunda.service; // 包名必须和配置的一致
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;
@Component // 交给 Spring 管理
public class LeaveApprovalService implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
// 业务逻辑
}
}
execute 方法Expression${bean 名称。方法名 (参数 1, 参数 2,...)}
bean 名称:Spring 容器中的 Bean 名(默认类名首字母小写,或 @Service("自定义名") 指定)方法名:Bean 中的具体方法名参数:可填流程变量名(直接写变量名)、常量(字符串加引号,数字直接写)${leaveService.checkDefaultRule()}@Service("leaveService")
public class LeaveService {
public boolean checkDefaultRule() {
return true;
}
}
${leaveService.checkLeaveLimit(applicant, leaveDays)}
applicant、leaveDays 是流程变量名,会自动传入方法checkResult(方法返回值会存到这个流程变量中)@Service("leaveService")
public class LeaveService {
public boolean checkLeaveLimit(String applicant, Integer leaveDays) {
System.out.println("校验" + applicant + "的请假天数:" + leaveDays);
return leaveDays <= 5;
}
}
${leaveService.calcLeaveDays(leaveDays, "2026-01-20")}
leaveDays 是流程变量,"2026-01-20" 是常量字符串execute 方法)Delegate expression${bean 名称}
bean 名称:Spring 容器中的 Bean 名,该 Bean 必须实现 JavaDelegate 或 ActivityBehavior 接口execute 方法${leaveApprovalService}@Component("leaveApprovalService") // Bean 名必须和表达式中的一致
public class LeaveApprovalService implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
// 业务逻辑
}
}
Connectorhttp-connector、email-connector)http-connector| 参数名 | 填写值示例 | 说明 |
|---|---|---|
url | https://api.example.com/leave/check | 目标接口地址 |
method | POST | 请求方法(GET/POST 等) |
headers | {"Content-Type":"application/json"} | 请求头(JSON 格式) |
payload | {"applicant":"${applicant}","leaveDays":${leaveDays}} | 请求体(可嵌入流程变量) |
resultVariable | httpResponse | 响应结果存储的流程变量名 |
camunda-connect-http-client)| 类型 | 填写核心格式 | 核心适用场景 |
|---|---|---|
| External | Topic 名(自定义字符串) | 耗时/分布式任务,解耦流程引擎 |
| Java class | 完整类名(包名 + 类名) | 简单同步任务,固定 execute 方法 |
| Expression | ${bean 名。方法名 (参数)} | 灵活调用 Bean 的任意方法 |
| Delegate expression | ${bean 名} | Spring Boot 集成首选,依赖注入友好 |
| Connector | 连接器 ID + 参数配置 | 无代码调用 HTTP/邮件等通用接口 |
核心建议:日常开发优先用 Delegate expression(简单、适配 Spring),耗时任务用 External,无代码集成用 Connector,Expression 用于灵活调用特定方法,Java class 仅做兼容使用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online