通过 Apache Camel 中的同一会话一次下载一个文件 FTP
Download one file at a time through the same session in Apache Camel FTP
我想用 Apache Camel 实现以下用例 FTP:
在远程位置,我存储了 0 到 n 个文件。
- 当我收到命令时,使用 FTP,我想下载一个文件作为字节数组(哪个文件无关紧要),如果有任何文件可用的话。
- 下载文件后,我想将其作为 blob 保存在数据库中。
- 然后我想删除远程位置的stored/processed文件
- 等待下一个下载命令,收到后返回步骤 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");
我想用 Apache Camel 实现以下用例 FTP:
在远程位置,我存储了 0 到 n 个文件。
- 当我收到命令时,使用 FTP,我想下载一个文件作为字节数组(哪个文件无关紧要),如果有任何文件可用的话。
- 下载文件后,我想将其作为 blob 保存在数据库中。
- 然后我想删除远程位置的stored/processed文件
- 等待下一个下载命令,收到后返回步骤 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");