Camel 3.x中如何在XML DSL路由中引用Exchange属性?
在Camel 3.x XML路由中引用Exchange属性的正确方式
首先明确:在Camel 3.x版本中,XML路由里引用Exchange属性的标准语法确实是${exchangeProperty.LASTPROCESSED}或${property.LASTPROCESSED},你遇到的问题大概率是其他环节的疏漏,以下是排查要点和正确用法示例:
一、确认属性设置的正确性
- 检查
LASTPROCESSED常量的实际值:确保它是大小写一致的字符串"LASTPROCESSED",Camel的属性名称是大小写敏感的,拼写错误会导致无法获取。 - 验证属性是否被成功设置:在Processor中添加日志输出,确认属性值确实被存入Exchange,比如:
private static final String LASTPROCESSED = "LASTPROCESSED"; @Override public void process(Exchange exchange) throws Exception { String targetValue = sortedBody[0].attribute6; exchange.setProperty(LASTPROCESSED, targetValue); // 打印日志确认 LoggerFactory.getLogger(getClass()).info("已设置属性LASTPROCESSED: {}", targetValue); }
二、XML路由中的正确引用场景
根据不同的使用场景,引用方式略有差异,以下是常见的正确写法:
1. 在日志、简单表达式中直接引用
<route id="property-test-route"> <from uri="direct:start"/> <!-- 先执行设置属性的Processor --> <process ref="yourProcessor"/> <!-- 使用exchangeProperty前缀引用 --> <log message="最后处理的值(exchangeProperty): ${exchangeProperty.LASTPROCESSED}"/> <!-- 使用property简写前缀引用 --> <log message="最后处理的值(property简写): ${property.LASTPROCESSED}"/> </route>
2. 在setBody、setHeader等节点中使用simple标签包裹
如果是在设置消息体或头等场景,建议用<simple>标签明确指定表达式类型,避免解析问题:
<setBody> <simple>${property.LASTPROCESSED}</simple> </setBody>
3. 使用property函数写法
也可以通过函数式语法引用,效果和前缀写法一致:
<log message="最后处理的值(函数式): ${property(LASTPROCESSED)}"/>
三、排查常见问题点
- 执行顺序问题:确保设置属性的Processor在引用属性的节点之前执行,如果引用节点在前,属性还未被设置,自然无法获取。
- 属性被覆盖/清除:检查路由中Processor之后、引用节点之前的组件或逻辑,是否有操作清除了Exchange属性(比如某些组件会重置Exchange上下文)。
- XML语法转义:如果属性值包含特殊字符,确保XML中没有转义错误,必要时用CDATA包裹表达式。
内容的提问来源于stack exchange,提问作者R M
相关产品推荐
相关产品推荐

