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



我正在使用Camel,ActiveMq和JMS来轮询目录并处理它找到的任何文件。 较大文件的问题在于它们在完全复制到目录中之前就开始处理。 我假设(是的,我知道什么假设会让你(文件系统会阻止它 - 但这似乎不是真的。 骆驼文档中的示例似乎不起作用。 这是我在路由生成器的配置方法中的代码:

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就会开始处理。 我所追求的只是在轮询文件之前的一个很好的简单延迟。 有什么想法吗?

使用选项readLockMinAge.

从 File2 组件文档:

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

对于 100 秒的延迟,URI 可能如下所示:

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

使用选项"readLock=changed"、"readLockCheckInterval=1000"和readLockMinAge=20s的组合 (1000 以毫秒为单位,默认值应更改为更高的值,即写入速度较慢,即文件大小在很长一段时间后发生变化,这可能发生在某些文件系统上,文件大小在传输过程中变化不是很频繁(

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

对于读取锁定=已更改

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

对于读取锁定检查间隔=1000

Camel 2.6:读锁定的间隔(以毫秒为单位((如果读锁定支持(。此间隔用于在尝试获取读锁定之间休眠。例如,使用更改的读锁定时,可以设置更高的间隔周期以满足写入速度较慢的情况。如果生成者写入文件的速度非常慢,则默认值 1 秒可能太快。

对于读取锁定最小年龄=20s

Camel 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"(

好吧,原来是事物的组合。 首先,我在IntelliJ内部进行了测试,并且出于多种原因在外部进行了测试-一个是在IDEA中使用电子邮件的安全问题。 在IntelliJ之外的Tomcat正在webapps/ROOT目录中拾取一个类文件夹,该文件夹覆盖了我对uri选项的更改。 这就是让我发疯的原因。 该根文件夹是从几个月前的部署错误中存在的。 但是即使我使用相同的Tomcat实例,IntelliJ也没有选择它。这就是为什么我的更改似乎被忽略了。

最新更新