我要构建的程序,使用骆驼2.18.5在Windows文件共享上消费文件,而其他程序偶尔会在共享文件夹中添加/修改/删除文件。
构建简单的测试路线
from("file:///C:/Temp/from?readLock=changed&readLockCheckInterval=10000&readLockTimeout=0")
.routeId("SimpleFileRoute")
.to("file:/C:/Temp/to");
然后将文件,test.txt放在文件夹中,等待进行test.txt.camellock文件的路由,然后手动删除test.txt。不抛出异常或处理任何其他文件。
"更改"似乎是唯一适合这种情况的Readlock。
有什么方法可以使路线异常,清理锁定文件并继续消费文件?
编辑:似乎是路线的线程的堆栈跟踪是这样:
Daemon Thread [Camel (camel-1) thread #2 - file:///C:/Temp/from] (Suspended)
Thread.sleep(long) line: not available [native method]
FileChangedExclusiveReadLockStrategy.sleep() line: 104
FileChangedExclusiveReadLockStrategy.acquireExclusiveReadLock(GenericFileOperations<File>, GenericFile<File>, Exchange) line: 90
GenericFileRenameProcessStrategy<T>(GenericFileProcessStrategySupport<T>).begin(GenericFileOperations<T>, GenericFileEndpoint<T>, Exchange, GenericFile<T>) line: 64
GenericFileRenameProcessStrategy<T>.begin(GenericFileOperations<T>, GenericFileEndpoint<T>, Exchange, GenericFile<T>) line: 37
FileConsumer(GenericFileConsumer<T>).processExchange(Exchange) line: 362
FileConsumer(GenericFileConsumer<T>).processBatch(Queue<Object>) line: 223
FileConsumer(GenericFileConsumer<T>).poll() line: 187
FileConsumer(ScheduledPollConsumer).doRun() line: 174
FileConsumer(ScheduledPollConsumer).run() line: 101
Executors$RunnableAdapter<T>.call() line: 511
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).runAndReset() line: 308
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$301(ScheduledThreadPoolExecutor$ScheduledFutureTask) line: 180
ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: 294
RejectableScheduledThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: 1142
ThreadPoolExecutor$Worker.run() line: 617
Thread.run() line: 745
好的,所以问题是您使用 readLockTimeout=0
,然后以何种原因(无论出于何种原因都无法授予文件锁定,从而防止读取锁定到超时。您不应该真正这样做(坏主意),因此将其设置为更高的超时值。
另一方面,我们还可以改进骆驼核,以检查文件检查时是否仍然存在更改,并且文件是否不存在,则可以退出支票。
我已经记录了一张票:https://issues.apache.org/jira/browse/browse/camel-13025