为何在Camel路由定义中需用${body}而非{{body}}?
问题:Camel路由中{{body}}占位符未按文档生效,${body}却正常运行
Camel文档指出属性占位符采用{{prop_name}}格式,但定义如下路由时,使用{{body}}无法得到预期输出:
<route> <from uri="timer:test-timer?period=5000" /> <setBody> <simple>Hello world!</simple> </setBody> <log message="Body: {{body}}" /> </route>
而使用${body}则可正常运行:
<route> <from uri="timer:test-timer?period=5000" /> <setBody> <simple>Hello world!</simple> </setBody> <log message="Body: ${body}" /> </route>
请问为何此处属性占位符替换未按文档生效?
原因解析
这是因为Camel中的两种占位符属于完全不同的替换机制:
{{prop_name}}是配置属性占位符,作用是读取静态配置(比如外部配置文件、环境变量或Camel上下文预定义的属性),替换过程在路由启动阶段完成,无法访问Exchange运行时的动态数据(如body、header这类随请求变化的Exchange变量)。${body}是Simple表达式语言的语法,专门用于访问Exchange运行时的动态内容,在路由执行到对应节点时,会实时从当前Exchange实例中取出body的值进行替换。
此处要访问的是Exchange的body,属于运行时动态数据,因此必须使用Simple表达式的${body}语法;而{{body}}只会去查找名为body的静态配置项,找不到则原样输出,自然无法得到预期结果。
内容的提问来源于stack exchange,提问作者Juanchomar
相关产品推荐
相关产品推荐

