Apache Camel, FTP consumer: 如何获取上一条路由的 header 参数?
Apache Camel, FTP consumer: How to take header parameters of the previous route?
我有几条骆驼路线,我在 Exchange object 中设置了一个 header,其中一条路线的名称为 FILE_NAME,同时从数据库读取数据。 作为下一步,这条路线更进一步到我的 FTP 路线,文件应该被下载到那里。 问题是 FTP 路线没有收到 headers 与我正在使用的 contentEnricher 的前一条路线。这是官方行为:http://camel.apache.org/content-enricher.html 但是,FTP 端点的 "fileName" 参数可以动态构建以下载特定文件。
我的FTP路线是这样的,现在有示意图数据:
from("direct:myRoute")
.pollEnrich("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=data.txt")
.to("mock:result");
我怎样才能只下载上一个路由的 header 值中提供的文件?我应该不使用内容丰富器还是应该将文件名存储在其他地方的变量中?也提前感谢您的回复。
编辑 1:
感谢我得到的帖子,但我需要回到同一点,因为我可以从 Java DSL 也可以从 pollEnrich() 中的简单表达式访问 header 值,但是不在 to() 中。进程(Exchange 交换)打印正确的 header 值,使用 sftp 消费者的 pollEnrich 从 sftp 服务器 获取文件,但 ${header.FILE_NAME_ONLY} 或 ${in.header.FILE_NAME_ONLY} 在 to() 中访问它。所以创建的文件将被命名为 "value of 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() 吞没了之前的 header 变量。因此它们可用于构建 URI,但之后无法访问以命名文件。我用的是骆驼 2.16.1.
我做了什么:
- 使用动态路由器创建了一条路由
- 创建了一个 bean,调用它来确定下一条到达的路线
- 在 pollEnrich 之前,我将必要的 header 值保存在交换的地图中
- 在 pollEnrich 之后,我得到保存的 header 值并将它们设置为 headers
- 然后它被路由到它写入文件的路由。 (它已经可以访问新设置的 header 个变量)
两个有用的例子:
- http://www.systemmobile.com/?p=427 "[...] 确定
路线中每个点之后的目的地端点,我们需要使用
动态路由器。 [...]"
- http://camel.apache.org/dynamic-router.html
手册 (http://camel.apache.org/content-enricher.html) 说:
From Camel 2.16 onwards both enrich and pollEnrich supports dynamic
endpoints that uses an Expression to compute the uri, which allows to
use data from the current Exchange.
您只需要使用 Camel 2.16 或更新版本。
编辑 1:
这应该可以正常工作
.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:")
您可以使用表达式来构建端点 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 开始可用
我有几条骆驼路线,我在 Exchange object 中设置了一个 header,其中一条路线的名称为 FILE_NAME,同时从数据库读取数据。 作为下一步,这条路线更进一步到我的 FTP 路线,文件应该被下载到那里。 问题是 FTP 路线没有收到 headers 与我正在使用的 contentEnricher 的前一条路线。这是官方行为:http://camel.apache.org/content-enricher.html 但是,FTP 端点的 "fileName" 参数可以动态构建以下载特定文件。
我的FTP路线是这样的,现在有示意图数据:
from("direct:myRoute")
.pollEnrich("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=data.txt")
.to("mock:result");
我怎样才能只下载上一个路由的 header 值中提供的文件?我应该不使用内容丰富器还是应该将文件名存储在其他地方的变量中?也提前感谢您的回复。
编辑 1:
感谢我得到的帖子,但我需要回到同一点,因为我可以从 Java DSL 也可以从 pollEnrich() 中的简单表达式访问 header 值,但是不在 to() 中。进程(Exchange 交换)打印正确的 header 值,使用 sftp 消费者的 pollEnrich 从 sftp 服务器 获取文件,但 ${header.FILE_NAME_ONLY} 或 ${in.header.FILE_NAME_ONLY} 在 to() 中访问它。所以创建的文件将被命名为 "value of 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() 吞没了之前的 header 变量。因此它们可用于构建 URI,但之后无法访问以命名文件。我用的是骆驼 2.16.1.
我做了什么:
- 使用动态路由器创建了一条路由
- 创建了一个 bean,调用它来确定下一条到达的路线
- 在 pollEnrich 之前,我将必要的 header 值保存在交换的地图中
- 在 pollEnrich 之后,我得到保存的 header 值并将它们设置为 headers
- 然后它被路由到它写入文件的路由。 (它已经可以访问新设置的 header 个变量)
两个有用的例子:
- http://www.systemmobile.com/?p=427 "[...] 确定 路线中每个点之后的目的地端点,我们需要使用 动态路由器。 [...]"
- http://camel.apache.org/dynamic-router.html
手册 (http://camel.apache.org/content-enricher.html) 说:
From Camel 2.16 onwards both enrich and pollEnrich supports dynamic endpoints that uses an Expression to compute the uri, which allows to use data from the current Exchange.
您只需要使用 Camel 2.16 或更新版本。
编辑 1:
这应该可以正常工作
.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:")
您可以使用表达式来构建端点 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 开始可用