如何在Apache Camel路由中设置setHeader并将其值传入脚本?
在Apache Camel路由中实现SetHeader并传递给脚本的完整方案
我来帮你补全这个Apache Camel路由代码,完美实现设置Header并将其值作为输入传递给脚本的需求。下面是完整的路由配置,我会在后面拆解关键部分的逻辑:
<routes xmlns="http://camel.apache.org/schema/spring"> <route id="com.performancebikes.RouteScript" autoStartup="false"> <!-- 从指定文件系统路径读取文件 --> <from uri="b2bmbFileSystem:com.performancebikes/tempSFTP/in"/> <!-- 将Body转换为UTF-8编码的String --> <convertBodyTo type="java.lang.String" charset="UTF-8"/> <!-- 再将String转换为DOM Document,方便后续XPath解析 --> <convertBodyTo type="org.w3c.dom.Document" charset="UTF-8"/> <!-- 用XPath拆分XML,提取采购订单号 --> <split> <xpath>/B2B_Documents/B2B_PurchaseOrder/Header/HeaderInfo/PurchaseOrderNumber/text()</xpath> <!-- 设置Header,将拆分出的采购订单号存入名为PurchaseOrderNumber的Header中 --> <setHeader name="PurchaseOrderNumber"> <simple>${body}</simple> </setHeader> <!-- 调用脚本组件(这里以Groovy脚本为例),将Header的值作为输入传递 --> <to uri="groovy:classpath:scripts/processPO.groovy?purchaseOrderNumber=${header.PurchaseOrderNumber}"/> <!-- 如果你用的是其他脚本类型,比如JavaScript,可以改成类似这样: --> <!-- <to uri="javascript:classpath:scripts/processPO.js?input=${header.PurchaseOrderNumber}"/> --> </split> </route> </routes>
关键部分说明
setHeader的实现:通过<simple>${body}</simple>把拆分后得到的采购订单号(此时Body就是XPath提取出的单个订单号)存入名为PurchaseOrderNumber的Header中。- 传递Header到脚本:在调用脚本的
to端点里,通过${header.PurchaseOrderNumber}这个表达式,直接引用刚才设置的Header值作为脚本的输入参数。 - 脚本适配:根据你实际使用的脚本类型(Groovy、JavaScript、Python等),调整
uri的前缀和参数传递方式即可,核心都是通过Camel的表达式语言引用Header。
内容的提问来源于stack exchange,提问作者Arundhathi D




