2013-09-20 2 views
2

Я использую Apache Camel 2.11.1Потеря файлов в верблюд, когда потребление с несколькими потоками

Есть такой маршрут:

from("file:///somewhere/"). 
threads(20). 
to("direct:process") 

Некоторое время я получаю это исключение: org.apache.camel.InvalidPayloadException с сообщением

No body available of type: java.io.InputStream but has value: GenericFile[/somewhere/file.txt] of type: 
org.apache.camel.component.file.GenericFile on: file.txt. Caused by: Error during type conversion from type: 
org.apache.camel.component.file.GenericFile to the required type: byte[] with value GenericFile[/somewhere/file.txt] 
due java.io.FileNotFoundException: /somewhere/file.txt (No such file or directory). 

Поскольку я вижу много файлов .camelLock в каталоге, я предполагаю, что это происходит из-за попытки нескольких потоков обрабатывать один и тот же файл. Как этого избежать?

ОБНОВЛЕНИЕ 1

Пытались использовать scheduledExecutorService и удалить threads(20). Кажется, я теряю меньше файлов, но все равно теряю их. Как избежать? Любая помощь будет оценена.

+0

Что вы делаете прямо: процесс? И какая ОС вы используете? –

+0

Я использую Linux. Фактически прямо: процесс просто считывает файл и работает с моими внутренними компонентами. – Archer

+0

получил ту же проблему, некоторые файлы удалены. Я вижу, что процесс выполняется из журналов, но затем не может быть найден ни в какой ошибке, сделан или в текущей папке. Полностью ушел – hsnkhrmn

ответ

0

У меня есть аналогичная проблема, у меня было 2 файловых процессора, извлекаемых из одного каталога. Результат: Потеря всех моих файлов.

Вот сценарий:

  • Thread#1 извлекает file1, перемещается в папку process
  • Thread#2 получающего же файл: file1 одновременно. file1 удален
  • Thread#2 не найден file1 в каталоге source, переименовать не удается.
  • Thread#1 не удается из-за удаленный файл по Thread#2

Вот причина:

Если метод проверки GenericFileProcessStrategySupport.renameFile, вы увидите верблюд первого удаляющий целевой файл, а затем переименовывает исходный файл к цели. Именно поэтому вышеуказанное условие происходит


Я не знаю о общем решении, либо разделения исходных потребительского отношения или реализовать механизм работы распределителя должны быть реализовано.

Sınce ваши потоки живут в одном JVM, я предлагаю вам реализовать параллельный дистрибутив нагрузки. Это дало бы имя запрашивающего 1 файла одновременно одновременно.

+0

попробуйте использовать noop = true, чтобы избежать перемещения/удаления файлов? – user1686407

Смежные вопросы