如何在复制文件时引入Camel延迟以防止文件锁定?

时间:2018-10-15 15:43:23

标签: apache-camel jms

我正在使用Camel,ActiveMq和JMS轮询目录并处理它找到的任何文件。较大文件的问题是它们在完全复制到目录之前开始处理。我已经假设(是的,我知道会给您带来什么假设)文件系统会阻止它-但这似乎不是事实。 Camel文档中的示例似乎不起作用。这是我在RouteBuilder的configure方法中的代码:

    from("file://" + env.getProperty("integration.directory.scan.add.eng.jobslist")+"?consumer.initialDelay=100000")
        .doTry()
            .setProperty("servicePath").constant("/job")
            .setProperty("serviceMethod").constant("POST")
            .process("engImportJobsFromFileProcessor")
        .doCatch(Exception.class)
            .to("log:-- Add Job(s) Error -------------------------")
            .choice()
                .when(constant(env.getProperty("eng.mail.enabled.flag.add.jobslist.yn")).isEqualToIgnoreCase("Y"))
                    .setHeader("subject", constant(env.getProperty("integration.mq.topic.add.eng.jobslist.error.email.subject")))
                    .to("direct://email.eng")
                .otherwise()
                    .to("log:-----------------------------------------")
                    .to("log:-- Email for JOBSLIST IS DISABLED")
                    .to("log:-----------------------------------------")
            .end()
        .end()
        .log("Finished loading jobs from file ")
    ;

如您所见,我尝试设置“ initialDelay”,也尝试了“ delay”和“ readLock = changed”,但没有任何改变。一旦文件到达目录,Camel就开始处理。我所要做的只是在轮询文件之前进行一个简单的延迟。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用选项“ readLock = changed”,“ readLockCheckInterval = 1000”和readLockMinAge = 20s的组合 (1000毫秒,默认值,应将其更改为较大的值,因为写入速度较慢,即文件大小在长时间后更改,这可能在某些文件系统上发生,即在传输过程中文件大小更改的频率不是很高)

文件组件文档@ http://camel.apache.org/file2.html

用于readlock =已更改

  

changed已使用文件长度/修改时间戳来检测当前是否正在复制文件。将至少使用1秒。确定这一点,因此该选项不能像其他文件一样快地消耗文件,但是可以更可靠,因为JDK IO API不能始终确定文件是否正在被另一个进程使用。选项readLockCheckInterval可用于设置检查频率。

对于readLockCheckInterval = 1000

  

Camel 2.6:读取锁的间隔(以毫秒为单位)(如果读取锁支持)。该间隔用于尝试获取读锁之间的休眠。例如,当使用更改的读取锁定时,可以设置较大的间隔时间以适应缓慢的写入。默认值为1秒。如果生产者写文件的速度很慢,则可能会太快。

对于readLockMinAge = 20s

  

骆驼2.15:此选项仅适用于readLock = change。此选项使您可以指定文件的最小年龄,然后再尝试获取读取锁。例如,使用readLockMinAge = 300s要求文件至少存在5分钟。当文件足够旧时,这可以加快轮询速度,因为它将立即获取读取锁定。

所以最终您的端点应该看起来像

from(“ file://” + env.getProperty(“ integration.directory.scan.add.eng.jobslist”)+“?consumer.initialDelay = 100000&readLock = changed&readLockCheckInterval = 1000&readLockMinAge = 20s”)

答案 1 :(得分:1)

好,原来是事情的结合。首先,我出于以下几个原因在IntelliJ内部和外部进行测试-一个是在IDEA中使用电子邮件的安全问题。 IntelliJ之外的Tomcat正在webapps / ROOT目录中拾取一个classes文件夹,该文件夹覆盖了我对uri选项的更改。那就是让我发疯的原因。该ROOT文件夹是几个月前因部署错误而存在的。但是,即使我使用的是相同的Tomcat实例,它也没有被IntelliJ接收。这就是为什么我的更改被忽略的原因。

答案 2 :(得分:0)

使用选项readLockMinAge

来自File2 component documentation

  

此选项允许您指定尝试获取读锁之前文件必须达到的最小期限。例如,使用readLockMinAge=300s要求文件至少5分钟。

对于URI,延迟100秒钟可能是这样的:

from("file://" + env.getProperty("integration.directory.scan.add.eng.jobslist")+"?readLock=changed&readLockMinAge=100s")