gpt4 book ai didi

apache-camel - Apache Camel,FTP 消费者 : How to take header parameters of the previous route?

转载 作者:行者123 更新时间:2023-12-04 06:07:58 26 4
gpt4 key购买 nike

我有几条 Camel 路线,我在 Exchange 对象中设置了一个 header ,其中一条路线的名称为 FILE_NAME,同时从数据库读取数据。 作为下一步,此路由会更进一步到我的 FTP 路由,文件应下载到该路由。 问题是 FTP 路由没有收到我正在使用的 contentEnricher 的前一个路由的 header 。这是官方行为: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 访问 header 值,也可以从 pollEnrich() 中的简单表达式访问 header 值,但不能从 to() 中访问。进程(Exchange 交换)打印正确的 header 值,带有sftp 消费者的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 在 2 月 25 日提出的动态路由器。问题在于 pollEnrich() 吞没了之前的 header 变量。因此它们可用于构建 URI,但之后无法访问以命名文件。我使用的是 Camel 2.16.1。

我做了什么:

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

两个有用的例子:

最佳答案

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

关于apache-camel - Apache Camel,FTP 消费者 : How to take header parameters of the previous route?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com