Camunda 服务任务(Service Task)中 External、Java class、Expression、Delegate expression、Connector 这 5 种实现方式的

前置说明

所有配置都在 Camunda Modeler 中完成:选中 Service Task 节点 → 右侧属性面板 → Implementation 下拉框选择对应类型 → 在下方的输入框(如Java Class、Expression等)填写内容。


1. External(外部任务)

填写规则

  • ImplementationExternal
  • 下方 Topic 输入框:填写自定义的外部任务主题名(字符串,无特殊格式,仅需和外部工作器(Worker)的主题名一致)
  • 可选:配置 Retry Time Cycle(任务失败后重试规则,如 R3/PT5M 表示重试3次,每次间隔5分钟)

示例

  • Topic 填写:leave_approval_check(请假审批校验)、order_payment_process(订单支付处理)
  • Retry Time Cycle 填写:R5/PT1M(重试5次,每次间隔1分钟)

适用场景

  • 耗时较长的业务逻辑(如调用外部接口、批量处理数据),避免阻塞流程引擎
  • 需要分布式部署的任务(多台机器的Worker可消费同一个Topic的任务)
  • 代码和流程引擎解耦(Worker可独立部署、扩容)

配套代码(外部Worker示例)

importorg.camunda.bpm.client.ExternalTaskClient;publicclassLeaveApprovalWorker{publicstaticvoidmain(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}}

2. Java class(Java类)

填写规则

  • ImplementationJava class
  • 下方 Java Class 输入框:填写完整类名(包名+类名),类必须实现 org.camunda.bpm.engine.delegate.JavaDelegate 接口
  • 要求:该类必须在 Camunda 引擎的类路径下(Spring Boot 项目中需加 @Component 或手动注册到Spring容器)

示例

  • 完整类名填写:com.example.camunda.service.LeaveApprovalService
  • 对应代码类:
packagecom.example.camunda.service;// 包名必须和配置的一致importorg.camunda.bpm.engine.delegate.DelegateExecution;importorg.camunda.bpm.engine.delegate.JavaDelegate;importorg.springframework.stereotype.Component;@Component// 交给Spring管理publicclassLeaveApprovalServiceimplementsJavaDelegate{@Overridepublicvoidexecute(DelegateExecution execution)throwsException{// 业务逻辑}}

适用场景

  • 简单的同步业务逻辑,代码和流程引擎耦合度可接受
  • 不需要灵活调用方法,仅需执行固定的 execute 方法

3. Expression(表达式)

填写规则

  • ImplementationExpression
  • 下方 Expression 输入框:填写 Spring EL表达式,格式为 ${bean名称.方法名(参数1, 参数2,...)}
    • bean名称:Spring容器中的Bean名(默认类名首字母小写,或@Service("自定义名")指定)
    • 方法名:Bean中的具体方法名
    • 参数:可填流程变量名(直接写变量名)、常量(字符串加引号,数字直接写)
  • 可选:Result Variable 输入框:填写变量名,用于接收方法返回值(回写到流程变量)

示例

场景1:调用无参方法
  • Expression:${leaveService.checkDefaultRule()}
  • 对应代码:
@Service("leaveService")publicclassLeaveService{publicbooleancheckDefaultRule(){returntrue;}}
场景2:调用带流程变量参数的方法
  • Expression:${leaveService.checkLeaveLimit(applicant, leaveDays)}
    • applicantleaveDays 是流程变量名,会自动传入方法
  • Result Variable:checkResult(方法返回值会存到这个流程变量中)
  • 对应代码:
@Service("leaveService")publicclassLeaveService{publicbooleancheckLeaveLimit(String applicant,Integer leaveDays){System.out.println("校验"+ applicant +"的请假天数:"+ leaveDays);return leaveDays <=5;}}
场景3:调用带常量+流程变量的方法
  • Expression:${leaveService.calcLeaveDays(leaveDays, "2026-01-20")}
    • leaveDays 是流程变量,"2026-01-20" 是常量字符串

适用场景

  • 需要灵活调用Bean的任意方法(而非固定的execute方法)
  • 方法有明确的参数和返回值,需直接映射到流程变量

4. Delegate expression(委托表达式)

填写规则

  • ImplementationDelegate expression
  • 下方 Delegate Expression 输入框:填写 Spring EL表达式,格式为 ${bean名称}
    • bean名称:Spring容器中的Bean名,该Bean必须实现 JavaDelegateActivityBehavior 接口
  • 核心:表达式只指定Bean名,引擎会自动调用该Bean的 execute 方法

示例

  • Delegate Expression:${leaveApprovalService}
  • 对应代码(和Java class的类结构一致,仅配置方式不同):
@Component("leaveApprovalService")// Bean名必须和表达式中的一致publicclassLeaveApprovalServiceimplementsJavaDelegate{@Overridepublicvoidexecute(DelegateExecution execution)throwsException{// 业务逻辑}}

适用场景

  • 推荐!Spring Boot集成Camunda的首选方式,比Java class更灵活(支持Spring依赖注入)
  • 代码复用性高(同一个Bean可被多个服务节点调用)
  • 便于单元测试(可通过Spring上下文注入Mock Bean)

5. Connector(连接器)

填写规则

  • ImplementationConnector
  • 下方 Connector Id 输入框:填写内置/自定义连接器ID(Camunda内置了部分连接器,如http-connectoremail-connector
  • 点击 Edit 按钮:在弹出的面板中配置连接器参数(键值对,不同连接器参数不同)

示例(最常用的HTTP连接器)

步骤1:填写Connector Id
  • Connector Id:http-connector
步骤2:配置参数(Edit面板中)
参数名填写值示例说明
urlhttps://api.example.com/leave/check目标接口地址
methodPOST请求方法(GET/POST等)
headers{"Content-Type":"application/json"}请求头(JSON格式)
payload{"applicant":"${applicant}","leaveDays":${leaveDays}}请求体(可嵌入流程变量)
resultVariablehttpResponse响应结果存储的流程变量名

适用场景

  • 无需编写Java代码,直接调用外部HTTP接口、发送邮件、操作数据库
  • 简单的集成场景(如调用第三方API、发送通知)
  • 非定制化的通用操作(避免重复编写HTTP调用、邮件发送代码)

注意

  • 内置连接器需引入对应依赖(如HTTP连接器需camunda-connect-http-client
  • 复杂的业务逻辑不适合用Connector,仍需用Java代码实现

总结

类型填写核心格式核心适用场景
ExternalTopic名(自定义字符串)耗时/分布式任务,解耦流程引擎
Java class完整类名(包名+类名)简单同步任务,固定execute方法
Expression${bean名.方法名(参数)}灵活调用Bean的任意方法
Delegate expression${bean名}Spring Boot集成首选,依赖注入友好
Connector连接器ID + 参数配置无代码调用HTTP/邮件等通用接口

核心建议:日常开发优先用 Delegate expression(简单、适配Spring),耗时任务用 External,无代码集成用 Connector,Expression 用于灵活调用特定方法,Java class 仅做兼容使用。

Read more

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk