在处理期间删除文件时,Apache Camel路由会挂起

时间:2018-12-20 09:40:02

标签: java apache-camel

我正在尝试构建的程序,使用Camel 2.18.5占用Windows文件共享上的文件,而其他程序有时会在共享文件夹中添加/修改/删除文件。

构建简单的测试路线

        from("file:///C:/Temp/from?readLock=changed&readLockCheckInterval=10000&readLockTimeout=0")
            .routeId("SimpleFileRoute")
            .to("file:/C:/Temp/to");

然后在from文件夹中放置文件test.txt,等待路由生成test.txt.camelLock文件,然后在通过readLockCheckInterval之前手动删除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  

1 个答案:

答案 0 :(得分:2)

好的,所以问题在于,您使用readLockTimeout=0可以防止由于某种原因而无法授予文件锁定时读取锁定超时。您实际上不应该这样做(不好的主意),因此请将其设置为更高的超时值。

另一方面,我们还可以改进camel-core来检查文件 changed 时是否仍然存在该文件,如果文件不存在则可以退出该检查。

我已经记录了有关此的票证:https://issues.apache.org/jira/browse/CAMEL-13025