我正在使用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就开始处理。我所要做的只是在轮询文件之前进行一个简单的延迟。有什么想法吗?
答案 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")