通过 Apache Camel 中的同一会话一次下载一个文件 FTP

Download one file at a time through the same session in Apache Camel FTP

我想用 Apache Camel 实现以下用例 FTP:

在远程位置,我存储了 0 到 n 个文件。

  1. 当我收到命令时,使用 FTP,我想下载一个文件作为字节数组(哪个文件无关紧要),如果有任何文件可用的话。
  2. 下载文件后,我想将其作为 blob 保存在数据库中。
  3. 然后我想删除远程位置的stored/processed文件
  4. 等待下一个下载命令,收到后返回步骤 1。

文件必须通过相同的 FTP 会话下载。

我的问题是,如果我使用正常的 FTP 路由,它会下载所有可用文件。 当我告诉路由只下载一个时,我必须为其他文件创建一个新路由,我不能重复使用 FTP 会话。

有没有办法用 Apache Camel 实现这个用例FTP?

Camel-ftp 不会一次使用所有可用文件,而是一个接一个地单独使用它们,这意味着每个文件都被单独处理。如果您需要按特定顺序处理它们,您可以尝试使用 file-name 或带有 sortBy 选项的修改日期。

如果您想控制何时下载文件,即何时调用命令,您可以使用 pollEnrich

调用 FTP 消费者端点

示例:

// 1. Loads one file from ftp-server with timeout of 3 seconds.
// 2. logs the body and headers
from("direct:example")
   .pollEnrich("ftp:host:port/directoryName", 3000)
   .to("log:loggerName?showBody=true&showHeaders=true");

您可以使用从 CamelContext 获取的 ProducerTemplate 调用直接消费者端点,或将其更改为适合您的用例的任何消费者端点。

如果您需要使用动态 URI,您可以使用简单的方式为 poll-enrich 提供 URI,并在之后提供超时。

from("direct:example")
   .pollEnrich()
       .simple("ftp:host:port/directoryName?fileName=${headers.targetFile}")
       .timeout(3000)
   .to("log:loggerName?showBody=true&showHeaders=true");