2

我有几条骆驼路线,并且在从数据库中读取数据时,我在一条路线中设置了一个名为 FILE_NAME 的 Exchange 对象的标头。作为下一步,这条路线会进一步到我的 FTP 路线,应该下载文件。问题是 FTP 路由没有收到带有我正在使用的 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");

我怎样才能只下载上一条路线的标头值中提供的文件?我应该不使用内容丰富器还是应该将文件名存储在其他地方的变量中?也提前感谢您的回复。

编辑1:

感谢我进一步了解的帖子,但我需要回到同一点,因为我也可以从 pollEnrich() 中的简单表达式访问 Java DSL 的标头值,但不能在 to() 中访问。进程(Exchange 交换)打印正确的标头值,带有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() 吞噬了之前的头变量。因此它们可用于构造 URI,但之后无法访问以命名文件。我使用的是骆驼 2.16.1。

我做了什么:

  1. 使用动态路由器创建路由
  2. 创建了一个 bean,该 bean 被调用来确定下一条要到达的路线
  3. 在 pollEnrich 之前,我将必要的标头值保存在交换的地图中
  4. 在 pollEnrich 之后,我得到保存的标头值并将它们设置为标头
  5. 然后它被路由到它写入文件的路由。(它已经可以访问新设置的头变量)

两个有帮助的例子:

4

2 回答 2

4

您可以使用表达式来构建端点 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 开始可用

于 2016-02-20T12:33:28.117 回答
3

手册(http://camel.apache.org/content-enricher.html)说:

Camel 2.16开始,enrich 和 pollEnrich 都支持使用 Expression 来计算 uri 的动态端点,这允许使用来自当前 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:")
于 2016-02-20T12:19:38.577 回答