Apache camel ApacheCamel,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/

我有几个驼峰路由,在从数据库读取数据时,我在Exchange对象中设置了一个名为FILE_name的头作为下一步,此路由将进一步转到我的FTP路由,在那里应该下载文件。问题是FTP路由没有使用我正在使用的contentEnricher接收上一个路由的头。这是官方行为:但是,FTP端点的“fileName”参数可以动态构造以下载特定文件

我的FTP路由如下所示,现在有原理图数据:

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

我所做的:

  • 使用动态路由器创建路由
  • 创建了一个bean,该bean被调用以确定要到达的下一个路由
  • 在调用之前,我将必要的头值保存在exchange的映射中
  • 之后,我得到保存的标题值,并将其设置为标题
  • 然后,它被路由到一个它写入文件的路由服务器。(它已经可以访问新设置的标题变量)
  • 两个有帮助的例子:

    • “[……]以确定 在路线中的每个点之后,我们需要使用 动态路由器。[…]”
      • 手册()上说:

        驼峰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,最终的解决方案是使用动态路由器。我将把它添加到问题中。