Перемещайте файлы с помощью Apache Camel в разные каталоги в зависимости от того, сколько файлов найдено - PullRequest
0 голосов
/ 13 сентября 2018

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

Я хочу забрать файлы и переместить ихв каталог A, если был один файл, и в каталог B, если найдено больше файлов.(И отправьте письмо какому-нибудь администратору).

// fileCounter and FileNameFilter use same utility class for filtering!
from(config.getFrom())
    .to("bean:bean:fileCounter?method=fileCountInHeader(*)")
    .choice()
        .when(simple("${header.NumberOfFiles} == 0"))
            .to("bean:grootboekMutatiesMailHandler?method=createMailNoFile(*)")
        .when(simple("${header.NumberOfFiles} == 1"))
            .filter().method(new FileNameFilter(), getFilterBy())
            .to(config.getA()))
            .to("bean:grootboekMutatiesMailHandler?method=createMailSuccess(*,${header.FileNamesList})")
        .when(simple("${header.NumberOfFiles} > 1"))
            .filter().method(new FileNameFilter(), getFilterBy())
            .to(config.getB())
            .to("bean:grootboekMutatiesMailHandler?method=createMailManyFiles(*,${header.FileNamesList})").endChoice().end();

Если маршрут верблюда начинается с файла, подсчет количества файлов будет выполняться для каждого файла по очереди, поэтому последний файл всегда будет передаватьсякаталог A.

Что мне действительно нужно, так это перечислить файлы в начале маршрута, сосчитать их, а затем только передать эти файлы в соответствующий каталог.Если файл добавлен, им следует пренебречь, если файл удален, выдается ошибка.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете использовать файл по прямому маршруту: OneFile, используя pollEnrich (http://camel.apache.org/content-enricher.html).). При желании вы можете установить имя файла в качестве значения заголовка в компоненте-счетчике и использовать его в URI pollEnrich.

....
from(direct:OneFile)
    .pollEnrich(<your file uri with dynamic Expression containing filename>, 0, 
                    pollEnrichAggregationStrategy)
...
0 голосов
/ 28 сентября 2018

Нет необходимости реализовывать компонент для подсчета файлов в конечной точке.Получение количества файлов, выстроенных в очередь для обработки, возможно, потому что File Consumer, включая ftp Consumer, является BatchConsumer .Это означает, что размер пакета может быть извлечен из свойств Exchange.

Вот рабочий пример маршрутизации файлов в зависимости от размера пакета, пример для потребителя файла, но также работает для ftp.

    final String from = "file:data/input?filter=#myFilter";
    final String to1 = "file:data/output";
    final String toMany = "file:data/output2";

    from(from)
    .choice()
    .when(simple("${exchangeProperty[CamelBatchSize]} == 1"))
     .to(to1)
    .when(simple("${exchangeProperty[CamelBatchSize]} > 1"))
      .to(toMany);

Обратите внимание, что любые фильтры должны быть установлены в конечной точке "from" .Фильтрация по маршруту (то есть: метод .filter (). (New MyFilter ()) нарушит логику подсчета пакетов. Файлы, не прошедшие фильтр, все равно будут учитываться в CamelBatchSize! Так что если файлы aaa.txt, aa.txt и bb.txt присутствуют в конечной точке 'from', но только bb.txt должен обрабатываться, фильтрация с использованием .filter () пропускает только bb.txt, но CamelBatchSize все равно будет 3, а не 1.

0 голосов
/ 14 сентября 2018

Я не вижу, как вы подсчитываете количество файлов в бине, но вместо этого вы можете использовать Camel Exchange свойство CamelBatchSize, которое возвращает количество файлов, прочитанных из каталога за один опрос. ,

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

Другим подходом может быть использование таймера для запуска в заданном интервале, а затем использование счетчика Java bean-компонента для подсчета файлов и делегирования на выделенные маршруты для трех случаев.

Нечто подобное (псевдокод)

from(timer:countFiles?yourOptions)
    .bean(counterBean)
    .choose
        .when(0 files)
            .to(direct:noFile)
        .when(1 file)
            .to(direct:OneFile)
        .otherwise
            .to(direct:TooMuchFiles)
    .end()

На прямых маршрутах у вас есть различные возможности использовать файлы:

  • Если вас не интересует содержимое, но вы хотите просто переместить файлы, вы можете использовать компонент, который делает это с кодом Java
  • Если вы хотите использовать один файл для получения его содержимого, вы можете использовать pollEnrich EIP
  • Если pollEnrich становится слишком неуклюжим из-за того, что вы хотите потреблять много файлов , вы можете написать выделенный маршрут с помощью файла from (file poller), который не запускается (autoStart = false). Вы можете использовать Controlbus для запуска и остановки этого маршрута по требованию от прямых маршрутов.
...