Apache Camel路由配置:创建文件后动态选本地存储或TCP发送
Apache Camel 动态路由配置方案
针对你的需求——单个from(file:input)源、仅执行一次消息创建逻辑、根据配置动态路由到文件存储或TCP端点(支持单启用/同时启用),以下是符合Camel架构设计的几种实现方案:
方法一:使用Recipient List组件(推荐)
Recipient List是Camel原生的动态路由组件,专门用于根据配置或消息内容选择一个/多个接收端点,完美适配你的场景,且不会出现同时启用端点的报错问题。
实现步骤
- 配置文件定义启用端点:
# 支持逗号分隔多个端点,例如 enabled.endpoints=file:output,tcp://localhost:9090 enabled.endpoints=file:output - 编写路由代码:
from("file:input") .process(exchange -> { // 执行你的createMessage()逻辑,仅触发一次 // 示例:生成或处理消息内容,交给后续Camel端点处理存储/发送 }) // 读取配置的端点列表,自动路由到所有指定目标 .recipientList(simple("${properties:enabled.endpoints}")) // 添加全局错误处理,避免单个端点失败中断整个路由 .onException(Exception.class) .log("端点处理失败: ${exception.message}") .handled(true);
- 说明:配置多个端点时,Camel会自动将消息转发到所有目标;修改配置即可切换启用状态,无需改动路由代码。
方法二:基于配置的条件分支(Filter)
如果需要独立控制每个端点的启用状态,可使用Filter结合配置属性实现分支逻辑:
from("file:input") .process(exchange -> { // 执行createMessage()逻辑,仅一次 }) // 判断是否启用文件存储 .filter(simple("${properties:enable.file.storage} == true")) .to("file:output") .end() // 判断是否启用TCP发送 .filter(simple("${properties:enable.tcp.send} == true")) .to("tcp://localhost:9090") .end();
- 配置文件补充:
enable.file.storage=true enable.tcp.send=false - 说明:两个Filter分支独立执行,同时启用时会依次完成文件存储和TCP发送,不会触发报错。
方法三:使用Dynamic Router(复杂场景适配)
如果需要结合消息内容+配置进行更复杂的路由判断,可使用Dynamic Router自定义逻辑:
from("file:input") .process(exchange -> { // 执行createMessage()逻辑 }) .dynamicRouter(exchange -> { // 读取配置属性 boolean enableFile = Boolean.parseBoolean( exchange.getContext().resolvePropertyPlaceholders("{{enable.file.storage}}") ); boolean enableTcp = Boolean.parseBoolean( exchange.getContext().resolvePropertyPlaceholders("{{enable.tcp.send}}") ); // 构建目标端点列表 StringBuilder endpoints = new StringBuilder(); if (enableFile) endpoints.append("file:output,"); if (enableTcp) endpoints.append("tcp://localhost:9090,"); // 返回端点列表(自动忽略末尾逗号) return endpoints.length() > 0 ? endpoints.substring(0, endpoints.length()-1) : null; });
关键注意事项
- 确保
createMessage()逻辑仅执行一次:将其放在路由的最前端Processor中,后续所有路由分支都会复用该结果; - 遵循Camel架构设计:不要在Processor中手动创建文件,而是让Camel的
file端点负责文件存储,你只需在Processor中准备好消息内容即可; - 异常处理:添加
onException捕获端点连接失败、文件写入错误等异常,避免单个端点故障导致整个路由中断。
内容的提问来源于stack exchange,提问作者Stimpson Cat
相关产品推荐
相关产品推荐

