Какой шаблон Camel EIP использовать для обозначения EOF?

У меня есть сценарий, в котором я обрабатываю большой файл журнала, загружая его в ESB на основе Camel. Первой остановкой на этой шине является процессор LogTransformer, который анализирует сообщения журнала из файла журнала одно за другим (в реальном времени) и создает фрагменты XML:

<log-record level="INFO" source="MyApp" .../>

Каждый из этих <log-record/> фрагментов XML помещается в очередь сообщений и забирается шиной. В конце концов он попадает в базу данных MySQL.

У меня есть определенные процессоры, которые я хочу запустить только после того, как файл журнала будет полностью обработан (все записи журнала были преобразованы в <log-record/> и поставлены в очередь, обработаны шиной и сохранены в БД). Такие вещи, как генераторы отчетов, компоненты бизнес-аналитики и т. Д. Эти процессоры не должны запускаться, пока весь журнал не будет поставлен в очередь.

Какой способ Camel автоматически указывает этим процессорам, что они могут начать работу?

Лучшее, что я могу придумать, - это сделать так, чтобы мой LogTransformer процессор (часть, которая анализирует записи журнала, преобразует их в <log-record> XML и ставит их в очередь) создает запись журнала EOF после завершения обработки журнала. Что-то вроде <log-record eof="true">. Затем он помещает это сообщение в очередь, как обычно.

Когда последний процессор в шине (который сохраняется <log-record> в MySQL) встречает запись журнала EOF, вместо того, чтобы сохранять ее, он ставит ее в очередь.

Эти генераторы отчетов, компоненты BI и т. Д. Ожидают начала сообщения в этой очереди.

Это решение кажется запутанным. Я новичок в ESB и Camel, поэтому я подумал, что будет EIP / процессор, который обрабатывает этот сценарий, но я не могу его найти. Как Camel Wizard структурирует это решение?


person Community    schedule 15.11.2012    source источник


Ответы (1)


Взгляните на Splitter (http://camel.apache.org/splitter.html) и Aggregator (http://camel.apache.org/aggregator2.html). Агрегатор может использовать CompleteSize, чтобы определить, что у него есть все части, необходимые для продолжения обработки.

person JimN    schedule 15.11.2012
comment
Спасибо @JimN (+1) - что, если в моем файле журнала 100 миллионов записей журнала? Я не думаю, что у меня может быть хотя бы одна Aggregator запись в памяти размером 100 Мбайт! Есть ли другое решение, чтобы указать другим процессорам, что они могут начать выполнение? - person ; 16.11.2012
comment
Вашему агрегатору не нужно агрегировать (кэшировать) все записи данных. Его можно просто использовать как дозорный, чтобы определить, когда были просмотрены все записи журнала. - person JimN; 16.11.2012