【发布时间】:2017-07-05 18:01:39
【问题描述】:
我最近开始使用 Camel 将一些文件通过 ftp 传输到远程服务器。有相当大量的数据需要传输(~5 GB)。为了快速传递该数据,我将 Camel 设置为使用几个线程。 我的配置类如下所示:
@Component
public class FTPCamelRoute extends SpringRouteBuilder {
@Value("${camel.zip.input}")
private String inputDirectory;
public void configure() {
from(inputDirectory + "?recursive=true&readLock=changed&readLockTimeout=3000&readLockCheckInterval=500&readLockMinAge=30s")
.onException(Exception.class).maximumRedeliveries(3).retryAttemptedLogLevel(LoggingLevel.WARN).continued(true).end()
.threads(10)
.log("Uploading file ${file:name}")
.to("{{camel.zip.output}}")
.log("Uploaded file ${file:name} complete.");
}
}
camel zip 输入输出文件夹的定义如下:
camel.zip.input=file\\:/Temp/
camel.zip.output=ftp://host:21?username=xxx&password=yyy&binary=true
运行我的代码时,所有文件都会被传输。但是,我反复收到多个文件的 readLock 超时(我会说大约 10% 的文件需要处理,抛出这个超时)。我假设一些线程试图锁定一个已经被另一个线程处理的文件,因此该文件的 readLock 超时。但是,这对于线程应用程序来说似乎不太合适。有没有办法解决这个问题?
提前谢谢
【问题讨论】:
-
我之前没有使用过
apache-camel,但是您是否可以在两者之间使用某种阻塞队列,以便线程可以将队列中的文件名出队。这将确保一个线程只能处理一个文件。 -
这可能是解决此问题的一种方法。我们选择了骆驼,因为它非常灵活,有很多配置选项,而且非常易于使用。我自己对队列不太熟悉,但如果项目仍处于启动阶段,我当然会考虑使用它。
标签: java multithreading apache-camel