Маршрут Apache Camel зависает при удалении файла во время обработки - PullRequest
0 голосов
/ 20 декабря 2018

Программа, которую я пытаюсь собрать, использует файлы на общем файловом ресурсе Windows, используя Camel 2.18.5 и другие программы, время от времени добавляющие / изменяющие / удаляющие файлы в общей папке.

Создание простого тестового маршрута

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

затем помещение файла test.txt в папку from, ожидание маршрута для создания файла test.txt.camelLock и последующее ручное удаление test.txt до того, как readLockCheckInterval пройдет, вызоветмаршрут для зависания на неопределенный срок без выдачи исключения или обработки каких-либо других файлов.

«изменен», по-видимому, является единственным подходящим 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 голосов
/ 21 декабря 2018

Хорошо, проблема в том, что вы используете readLockTimeout=0, который затем предотвращает тайм-аут блокировки чтения, если по какой-либо причине блокировка файла не может быть предоставлена.Вы не должны этого делать (плохая идея), поэтому установите для него более высокое значение тайм-аута.

С другой стороны, мы также можем улучшить Camel-Core, чтобы проверить, существует ли файл, когда он проверяет изменилось , и если файл не существует, он также может выйти из чека.

Я зарегистрировал тикет по этому поводу: https://issues.apache.org/jira/browse/CAMEL-13025

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...