我有几个camel路由,我在Exchange对象中设置了一个标题,在一条路由中名称为FILE_NAME,同时从数据库中读取数据。 作为下一步,此路由会进一步到我的FTP路由,在那里应该下载文件。问题是FTP路由没有收到我使用的contentEnricher的上一个路由的标头。这是官方行为:http://camel.apache.org/content-enricher.html然而," fileName"可以动态构造FTP端点的参数以下载特定文件。
我的FTP路由如下所示,现在使用原理图数据:
from("direct:myRoute")
.pollEnrich("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=data.txt")
.to("mock:result");
我如何只下载上一个路由的标头值中提供的文件?我应该不使用内容更丰富,还是应该将fileName存储在其他地方的变量中?也请提前感谢您的回复。
EDIT1:
感谢我进一步发布的帖子,但我需要回到同样的点,因为我可以从poll DSL中的简单表达式访问Java DSL的头值,但不能访问to()。进程(Exchange交换)打印正确的标头值,pollEnrich与 sftp使用者从
from("direct:SFTP").routeId("SFTP")
.log("### SFTP")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
LOGGER.info("### Process SFTP " +
"FILE_NAME_ONLY = " + exchange.getIn().getHeader("FILE_NAME_ONLY" ) +
" FILE_PATH = " + exchange.getIn().getHeader("FILE_PATH") +
" AGG = " + exchange.getIn().getHeader("AGG"));
}
})
.choice()
.when(header("FILE_NAME_ONLY").isEqualTo(""))
.log("### SFTP FILE_NAME_ONLY is null!")
.endChoice()
.otherwise()
.log("### SFTP FILE_NAME_ONLY is NOT null!")
.pollEnrich().simple("sftp:" + ftpUid + "@" + ftpHost + "/" + ftpBasePath + "/${header.FILE_PATH}?password=" +
ftpPwd + "&binary=true&fileName=${header.FILE_NAME_ONLY}")
.to("file:extract?fileName=" + obNumber + "_${header.FILE_NAME_ONLY}")
.end();
解决方案:
最终解决方案是Jeremie B在25 Febr上提出的动态路由器。问题是pollEnrich()吞噬了以前的头变量。因此,它们可用于构造URI,但之后无法访问它来命名文件。我使用的是骆驼2.16.1。
我做了什么:
两个有用的例子:
答案 0 :(得分:3)
您可以使用表达式构建端点uri:
from("direct:myRoute")
.pollEnrich().simple("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=${header.FILE_NAME}")
.to("mock:result")
如Alexey所述,自v2.16以来可以使用
答案 1 :(得分:2)
手册(http://camel.apache.org/content-enricher.html)说:
从 Camel 2.16 开始,rich和pollEnrich都支持动态 使用Expression来计算uri的端点,允许使用 使用当前交易所的数据。
您只需使用 Camel 2.16 或更新版本。
<强> EDIT1:强>
这应该可以正常工作
.to("file:?fileName=extract/" + obNumber + "_${header.FILE_NAME_ONLY}")
或试试这个:
.recipientList(simple("file:?fileName=extract/" + obNumber + "_${header.FILE_NAME_ONLY}"))
或试试这个:
.setHeader("CamelFileName").simple("extract/"+obNumber+"_${header.FILE_NAME_ONLY}")
.to("file:")