Apache camel ApacheCamel,FTP消费者:如何获取上一个路由的头参数?
我有几个驼峰路由,在从数据库读取数据时,我在Exchange对象中设置了一个名为FILE_name的头作为下一步,此路由将进一步转到我的FTP路由,在那里应该下载文件。问题是FTP路由没有使用我正在使用的contentEnricher接收上一个路由的头。这是官方行为:但是,FTP端点的“fileName”参数可以动态构造以下载特定文件 我的FTP路由如下所示,现在有原理图数据:Apache camel ApacheCamel,FTP消费者:如何获取上一个路由的头参数?,apache-camel,camel-ftp,Apache Camel,Camel Ftp,我有几个驼峰路由,在从数据库读取数据时,我在Exchange对象中设置了一个名为FILE_name的头作为下一步,此路由将进一步转到我的FTP路由,在那里应该下载文件。问题是FTP路由没有使用我正在使用的contentEnricher接收上一个路由的头。这是官方行为:但是,FTP端点的“fileName”参数可以动态构造以下载特定文件 我的FTP路由如下所示,现在有原理图数据: from("direct:myRoute") .pollEnrich("ftp://foo@localhost/
from("direct:myRoute")
.pollEnrich("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=data.txt")
.to("mock:result");
如何仅下载上一个路由的头文件值中提供的文件?我应该不使用content enricher,还是应该将文件名存储在其他地方的变量中?也提前感谢您的回复
EDIT1:
感谢我得到的进一步的帖子,但我需要回到同一点,因为我可以从Java DSL访问头值,也可以从pollRich()中的简单表达式访问头值,但不能从to()中访问头值。进程(Exchange)打印正确的头值,带有sftp使用者的POLLRINCH从sftp服务器获取文件,但是${header.file\u NAME\u ONLY}和${in.header.file\u NAME\u ONLY}都不能在to()中访问它。。因此,创建的文件将被命名为“obNumber的值”。你能看看下面的代码片段中有什么不正确吗
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在2月25日提出的动态路由器。问题是pollEnrich()会吞噬前面的头变量。因此,它们可以用来构造URI,但之后无法访问它们来命名文件。我用的是骆驼2.16.1
我所做的:
- “[……]以确定 在路线中的每个点之后,我们需要使用 动态路由器。[…]”
- 手册()上说:
从驼峰2.16开始,enrich和pollEnrich都支持动态
使用表达式计算uri的端点,该uri允许
使用来自当前Exchange的数据
您只需使用骆驼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:")
或者试试这个:
.recipientList(simple("file:?fileName=extract/" + obNumber + "_${header.FILE_NAME_ONLY}"))
.setHeader("CamelFileName").simple("extract/"+obNumber+"_${header.FILE_NAME_ONLY}")
.to("file:")
您可以使用表达式来构建端点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开始提供。。。或更新版本,如2.16+。谢谢你,@Claus Ibsen,我修好了。你对编辑1有什么想法吗?你对编辑1有什么想法吗?Jeremie,最终的解决方案是使用动态路由器。我将把它添加到问题中。