Apache Camel路由中如何将Exchange body值传入rest:get调用步骤
Camel路由动态拼接REST端点解决方案
问题根源
你写法错误的核心原因是:
RouteBuilder.configure()方法是路由初始化阶段执行的,此时还没有任何请求消息进入路由,你写的.to("rest:get:" + endpoint + "/" + id)字符串拼接逻辑会在初始化阶段就执行完成,拼接的是类变量id的默认值null,后续运行时处理消息时修改id类变量不会改变已经初始化完成的静态端点地址。- 类变量是整个路由实例共享的,多并发请求场景下会出现线程安全问题,完全不适合存储单条请求的上下文数据。
正确解决方案
Camel提供了toD(动态收件人端点)组件,专门用于运行时动态计算目标端点地址,支持通过simple表达式直接读取Exchange的Body、Header等上下文数据,不需要额外定义类变量和处理器赋值。
修改后的代码如下:
public class SomeRoute extends RouteBuilder { @ConfigProperty(name = "rest.external.host") String host; @ConfigProperty(name = "rest.external.endpoint") String endpoint; @Override public void configure() throws Exception { restConfiguration().host(host); from("direct:routeEntry") .log(LoggingLevel.INFO, log, body().toString()) .setHeader(Exchange.HTTP_METHOD, constant("GET")) .removeHeader(Exchange.HTTP_PATH) .removeHeaders("Camel*") // 不需要自定义处理器赋值类变量,直接用toD动态拼接端点 .toD("rest:get:" + endpoint + "/${body}") .convertBodyTo(String.class); } }
如果你的Body里包含复杂内容,也可以先将需要的id提取出来存到消息头,再在toD中读取头字段:
from("direct:routeEntry") // 前序逻辑省略 .setHeader("requestId", body()) .toD("rest:get:" + endpoint + "/${header.requestId}") // 后续逻辑省略
说明
simple表达式里的${body}会自动读取当前Exchange的In消息Body内容,toD会在每条消息处理时动态计算端点地址,完全符合动态拼接REST路径的需求,同时规避了类变量的线程安全问题。
内容的提问来源于stack exchange,提问作者PowerfullDeveloper
相关产品推荐
相关产品推荐

