Apache Camel,FTP使用者:如何获取上一个路由的头参数?

时间:2016-02-20 11:47:11

标签: apache-camel camel-ftp

我有几个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使用者从服务器获取文件,但不包括$ {header.FILE_NAME_ONLY}和$ {in.header。 FILE_NAME_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在25 Febr上提出的动态路由器。问题是pollEnrich()吞噬了以前的头变量。因此,它们可用于构造URI,但之后无法访问它来命名文件。我使用的是骆驼2.16.1。

我做了什么:

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

2 个答案:

答案 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:")