Camel 4.x.x多次调用UnitOfWork获取原始消息体返回空的问题
解决Camel 4.x.x中多次获取原始消息体为空的问题
补充配置项调整
除了你已设置的allowUseOriginalMessage,还需要添加以下配置来恢复Camel 2.x.x中重复读取原始消息体的行为:
- Spring Boot环境:添加
camel.springboot.stream-caching-enabled=true - Camel Main模式:添加
camel.main.streamCachingEnabled=true
Camel 4.x默认采用流处理消息体,流类型的内容读取一次后就会耗尽,开启流缓存后会将消息体转为可重复读取的缓存对象,解决多次调用返回空的问题。
代码兼容方案
如果配置调整后仍有场景不生效,可以在交换的早期节点一次性缓存原始消息体,后续直接复用缓存值,避免重复调用getOriginalInMessage().getBody():
// 首次获取时缓存原始消息体到交换属性 Object originalBody = exchange.getUnitOfWork().getOriginalInMessage().getBody(); exchange.setProperty("ORIGINAL_BODY", originalBody); // 后续需要使用时直接从属性读取 Object reusedBody = exchange.getProperty("ORIGINAL_BODY");
额外注意点
- Camel 4.x对原始消息的处理逻辑做了内存优化,默认不再自动缓存流类型消息体,必须显式开启流缓存才能匹配2.x的行为。
- 部分特定组件(如File、HTTP)可能有独立的流处理配置,若仍存在问题,需检查对应组件的缓存开关是否开启。
内容的提问来源于stack exchange,提问作者sturaw
相关产品推荐
相关产品推荐

