当前位置: 首页 > 知识库问答 >
问题:

Apache Camel,FTP消费者:如何获取前一条路由的头参数?

丁震博
2023-03-14

我有几条骆驼路由,在从DB读取数据时,我在Exchange对象中设置了一个头,其中一条路由的名称为FILE_NAME。作为下一步,这条路由将进一步转到我的FTP路由,文件应该在那里下载。问题是FTP路由没有接收到我正在使用的contentEnricher的前一条路由的头。这是官方行为:http://camel.apache.org/content-enricher.html。但是,可以动态构造FTPendpoint的“filename”参数以下载特定文件。

我的FTP路由看起来是这样的,现在有示意数据:

from("direct:myRoute")   
.pollEnrich("ftp://foo@localhost/public/reports?password=secret&binary=true&fileName=data.txt") 
.to("mock:result");

编辑1:

感谢我的文章,但我需要回到同一点,因为我可以从Java DSL访问头值,也可以从pollrelch()中的简单表达式访问头值,但不能在to()中访问头值。进程(Exchange Exchange)打印正确的头值,sftp使用者的PollRelch从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();

解决方案:

    null

两个有用的例子:

  • http://www.systemmobile.com/?p=427“[...]要确定路由中每个点之后的目的endpoint,我们需要使用动态路由器。[...]”
  • http://camel.apache.org/dynamic-router.html

共有1个答案

祁宾白
2023-03-14

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

从Camel2.16开始,relch和pollrelch都支持动态endpoint,该endpoint使用表达式计算uri,从而允许使用来自当前交换的数据。

您只需使用Camel2.16或更新版本即可。

.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:")
 类似资料:
  • 问题内容: 通过Rabbitmq中的示例,消费者可以一次从队列中获取所有消息。如何使用一条消息并退出? 问题答案: 您必须声明basicQos设置,才能一次从ACK到NACK状态获取一条消息,并禁用自动ACK以便显式给出确认。 希望能帮助到你!

  • 我在导航菜单中有下拉菜单来更改区域设置。但我不知道如何获得参数。如何获取当前参数? 当前参数:slug、quiz_id、id等 navigaiton菜单刀片: 我有不同的路线。 web.php

  • 本文向大家介绍如何获取路由传过来的参数?相关面试题,主要包含被问及如何获取路由传过来的参数?时的应答技巧和注意事项,需要的朋友参考一下 如果使用方式传入的参数使用 接收 如果使用方式传入的参数使用接收 参考:路由组件传参

  • 本文向大家介绍Kafka 的消费者如何消费数据相关面试题,主要包含被问及Kafka 的消费者如何消费数据时的应答技巧和注意事项,需要的朋友参考一下 消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置 等到下次消费时,他会接着上次位置继续消费

  • 我有多个Kafka消费者和制作人,主题不同。使用独立应用程序,我想监控Kafka消费者的延迟。 我使用Kafka0.10.0.1,因为Kafka现在存储消费者偏移Kafka本身,所以我怎么能读到相同的。 我能够读取每个分区的主题偏移量。