Верблюжий файл Apache с doneFileName

Я только начинаю смотреть на верблюда apache (используя маршруты чертежей), и я уже застрял.

Мне нужно обработать набор CSV-файлов разных форматов. Я получаю 5 файлов с foo_X_20160110.csv, где X указывает тип файла csv, а файлы имеют отметку даты. Эти файлы могут быть довольно большими, поэтому файл «Готово» записывается после записи всех файлов. Готовый файл называется foo_trigger_20160110.csv.

Я видел параметр doneFileName в файле, но он поддерживает только статическое имя (у меня есть дата в имени файла) или ожидает готовый файл для каждого входного файла.

Файлы должны обрабатываться в фиксированном порядке, но не гарантируется порядок их записи во входной каталог. Следовательно, мне нужно дождаться готового файла.

Любая идея, как это можно сделать с Camel?

Любые предложения для хороших книг Верблюда?


person Ben    schedule 27.01.2016    source источник
comment
Привет, это было несколько вопросов сразу. Можете ли вы уточнить, какой вопрос вас интересует? Что касается книг, вы должны начать с Camel in Action, которая является основной книгой, а затем есть Camel Cookbook.   -  person Souciance Eqdam Rashti    schedule 28.01.2016
comment
Спасибо за рекомендацию книги. Основной вопрос заключался в том, как я могу настроить URI файла для использования нестатического готового файла и обрабатывать другие файлы в каталоге только тогда, когда этот 0-байтовый готовый файл (с изменением имени в зависимости от даты) присутствует   -  person Ben    schedule 28.01.2016


Ответы (1)


Вот пример из документации http://camel.apache.org/file2.html.

from("file:C:/temp/input.txt?doneFileName=done");

Как видите, doneFileName имеет статическое значение «done». Но вы можете использовать стандартную java для написания динамических имен, то есть для текущего формата даты или чего-либо еще, и просто использовать строковую операцию для создания URI. Надеюсь, это поможет.

Обновлять:

Кстати, как упоминалось в документации, есть возможность динамических заполнителей для doneFileName.

Однако более распространено иметь один готовый файл для каждого целевого файла. Это означает, что существует соотношение 1:1. Для этого вы должны использовать динамические заполнители в опции doneFileName. В настоящее время Camel поддерживает следующие два динамических токена: file:name и file:name.noext, которые должны быть заключены в ${}. Потребитель поддерживает только статическую часть имени готового файла в виде префикса или суффикса (но не обоих).

from("file:bar?doneFileName=${file:name}.done");

Вы также можете использовать префикс для готового файла, например:

from("file:bar?doneFileName=ready-${file:name}");
person Souciance Eqdam Rashti    schedule 28.01.2016
comment
Спасибо, не могли бы вы рассказать, как вы будете вызывать Java для создания динамического имени из URI файла? Извините еще рано. Завтра выйдет книга «Верблюд в действии». - person Ben; 28.01.2016
comment
Я предполагаю, что одним из вариантов было бы использование пользовательской processStrategy с помощью GenericFileProcessStrategy? - person Ben; 28.01.2016
comment
Я не думаю, что вам это нужно. Со стандартной java я имею в виду, если готовый файл имеет имя currentdate.txt, где currentdate - сегодняшняя дата. Затем вы просто находите это, используя стандартную Java, и объединяете это для создания URI. Это должно быть одним из способов получить динамические имена файлов. - person Souciance Eqdam Rashti; 28.01.2016
comment
Если я настрою маршрут с помощью Java DSL, да, я смогу легко сделать это в первый день, но это приложение может работать несколько дней, а маршрут настраивается только один раз. Так как бы я изменил это? И как мне получить динамическое имя файла при использовании схемы XML? - person Ben; 28.01.2016
comment
Я не уверен, что ты имеешь в виду под первым свиданием. В java вы можете получить текущую дату, что означает сегодняшнюю дату, она даст вам дату, когда вы запустите ее завтра, через день и т. д. Это метод. Строка timeStamp = new SimpleDateFormat(yyyyMMdd_HHmmss).format(Calendar.getInstance().getTime()); - person Souciance Eqdam Rashti; 28.01.2016
comment
Для плана вам, вероятно, придется создать процессор, который дает вам доступ к написанию кода Java, сделать то же самое там и заполнить заголовок обмена, а затем в dsl плана объединить два. Честно говоря, я бы советовал использовать блупринт только для загрузки маршрутов. Остальное, то есть логика маршрутизации и все остальное, делается в java dsl. Намного легче. - person Souciance Eqdam Rashti; 28.01.2016