Apache Camel 3.11+版本Splitter未填充Exchange拆分属性问题
问题根因
这不是框架Bug,是Camel正式版迭代后的默认策略调整,叠加路由写法、版本兼容问题共同导致的:
- 你之前用的3.0.0-RC3是早期预览版,当时Split EIP生成的
CamelSplitIndex、CamelSplitSize、CamelSplitComplete三个分片标记属性默认作为普通Exchange属性传递,跨direct端点转发不会丢失。 - 从Camel 3.1正式版开始,这三个属性被调整为Split EIP执行上下文内的临时内部属性,默认仅在
split()调用的当前链路范围内可见。你现在的写法是拆分完成后立刻把消息.to("direct:afterSplit1")转发到独立定义的外部路由,默认的Exchange复制策略会过滤掉这类内部临时属性,下游Processor自然读不到值。 - 额外注意:你当前依赖里的Spring Boot 2.1.11.RELEASE和Camel 3.11.x/3.17.x存在明确的版本不匹配,Camel 3.11.x适配Spring Boot 2.5及以上版本,3.17.x适配Spring Boot 2.6及以上版本,版本错配也可能触发各类上下文丢失、属性传递异常的问题,升级Camel的时候记得同步升级Spring Boot版本。
解决方案
按你的业务场景选一种即可:
- 方案1(最推荐,零额外配置):直接把分片处理逻辑挂载到Split调用链上,不要转独立direct路由,分片属性会全程可见:
from("direct:toSplit") .split(body()) .process(postSplitProcessor) .end();
- 方案2(需保留独立路由结构时用):在Split配置上显式开启工作单元共享,配置后分片相关的内部属性会随Exchange跨路由传递:
from("direct:toSplit") .split(body()).shareUnitOfWork() .to("direct:afterSplit1");
- 方案3(适配复杂多跳路由场景):在Split链路内加一个前置处理步骤,把三个内置分片属性转存为自定义的普通属性/消息头,自定义属性不会被跨路由过滤逻辑清除:
from("direct:toSplit") .split(body()) .process(exchange -> { exchange.setProperty("splitIdx", exchange.getProperty("CamelSplitIndex")); exchange.setProperty("splitTotal", exchange.getProperty("CamelSplitSize")); exchange.setProperty("splitIsLast", exchange.getProperty("CamelSplitComplete")); }) .to("direct:afterSplit1");
后续在postSplitProcessor里读取你自定义的这几个属性,就能正常判断当前消息是不是最后一个分片了。
内容的提问来源于stack exchange,提问作者worldbeater
相关产品推荐
相关产品推荐

