【问题标题】:Apache Camel Cannot acquire lock within xxx millis. Will skip the fileApache Camel 无法在 xxx 毫秒内获取锁。将跳过文件
【发布时间】: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


【解决方案1】:

您不应该自己产生线程。除非另有说明,否则 Camel 将读取您的源目录中的所有文件,并在单独的线程中处理每个文件。您的读锁可能是由于部分或所有其他线程试图访问已被第一个线程锁定的文件。

【讨论】:

  • 是的,我也是这么想的。看起来这更像是 apache-camel 本身的一个错误,而不是其他任何东西。我只是想知道是否有任何方法可以轻松克服这个问题,也许是通过更改一些骆驼配置选项?我尝试使用锁定策略,但似乎没有一个能解决问题。
  • 我的意思是文件组件及其衍生产品(例如 ftp 或 sftp)本身是多线程的。因此,您实际上不需要使用treads DSL。您获得的读锁发生在您自己的线程之前,这表明您正在不断地将文件写入您正在轮询的目录,对吗?如果路由无法获得排他锁,则将跳过该文件。为避免这种情况,您应该将文件写入临时目录,然后将它们移动到您用作源端点的目录。
  • 啊哈!你说得对。我的 spring-batch 处理正在生成文件并将这些文件写入目录。这个相同的目录用作我的骆驼处理的起点。正是出于这个原因,我使用了“已更改”的 readlock,readLockMinAge 为 30 秒。我的春季批处理绝对不需要比将文件写入该目录的时间更长,但也许我在那里忽略了一些东西。但是,将“threads(10)”添加到整个骆驼处理中确实显着加快了 ftp(我的测试运行时间大约是以前没有线程时的 1/3)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多