我有以下路线:
<route id="import">
<from uri="file:/var/inputfolder?delete=true"/>
<log message="Importing ${file:name} started."/>
<setProperty propertyName="keepbody">
<simple>${body}</simple>
</setProperty>
<setHeader headerName="BrandId">
<simple>${file:name}</simple>
</setHeader>
<setHeader headerName="CamelExecCommandArgs">
<simple>${file:absolute.path} ${header.BrandId.toString.split("_")[0]} Zip -a erase</simple>
</setHeader>
<to uri="exec://./transfile.php?workingDir=/usr/bin/&args&useStderrOnEmptyStdout=true"/>
<log message="stdout/stderr of /usr/bin/transfile.php:\n ${body}"/>
<choice>
<when>
<simple>${bodyAs(String)} contains 'Return OK'</simple>
<log message="Importing ${file:name} finished."/>
</when>
<otherwise>
<log message="Importing ${file:name} failed."/>
<setBody>
<simple>${exchangeProperty.keepbody}</simple>
</setBody>
<to uri="file:/var/rejected"/>
</otherwise>
</choice>
</route>
该路由检查文件夹/var/inputfolder 中的文件。如果找到任何文件,它将执行 transfile.php 脚本,并在其参数中使用文件名。如果此执行的输出不包含字符串“Return OK”,则标准输出将放入文件夹/var/rejected 中具有原始文件名的文件中。 但我想实现的是,在/var/rejected 文件夹中,显示其原始内容的文件,而不是执行的输出。我知道,这是 exec 组件的正常行为
https://camel.apache.org/exec.html
但是我如何改变它来实现前面提到的?
提前致谢!
最佳答案
您需要将消息正文存储为交换属性,然后在 exec
之后替换正文
<setProperty propertyName="keepBody">
<simple>${body}</simple>
</setProperty>
然后恢复它
<setBody>
<simple>${exchangeProperty.keepBody}</simple>
</setBody>
请注意,根据您使用的 Apache Camel 的旧版本,名称 exchangeProperty
可能是较旧的名称,例如 property
。查看更多信息:http://camel.apache.org/simple
我们正在考虑向 Camel DSL 添加推送/弹出功能,以便将来更容易实现:https://issues.apache.org/jira/browse/CAMEL-8958
关于apache-camel - Apache Camel exec 消息正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31381783/