有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache Camel无法在xxx毫秒内获取锁。将跳过该文件

我最近开始使用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超时。然而,对于线程应用程序来说,这种行为似乎并不合适。有没有办法绕过这个问题

提前通知


共 (1) 个答案

  1. # 1 楼答案

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