2013-03-06 7 views
0

Я хочу, чтобы у меня было подобное поведение: Camel читает файл из каталога, разбивает его на куски (с помощью потоковой передачи), отправляет каждый фрагмент в очередь для одновременной обработки, а после обработки сделано, генератор отчетов вызывается. Это мой верблюд маршрут:Apache camel using seda

from("file://c:/mydir?move=.done") 
.to("bean:firstBean") 
.split(ExpressionBuilder.beanExpression("splitterBean", "split")) 
.streaming() 
.to("seda:processIt") 
.end() 
.to("bean:reportGenerator"); 

from("seda:processIt") 
.to("bean:firstProcessingBean") 
.to("bean:secondProcessingBean"); 

Когда я запускаю это, reportGenerator боб работать одновременно с обработкой Седа. Как заставить его работать один раз после завершения обработки всего седана?

ответ

2

сплиттер имеет встроенный параллельно, так что вы можете сделать это проще следующим образом:

from("file://c:/mydir?move=.done") 
    .to("bean:firstBean") 
    .split(ExpressionBuilder.beanExpression("splitterBean", "split")) 
    .streaming().parallelProcessing() 
    .to("bean:firstProcessingBean") 
    .to("bean:secondProcessingBean"); 
    .end() 
    .to("bean:reportGenerator"); 

Вы можете увидеть более подробную информацию о параллелях опции на странице сплиттер Camel: http://camel.apache.org/splitter

+0

Это работает неплохо, но есть ли способ использовать компонент seda для добиться того же результата? – mike27

1

Я думаю, вы можете использовать шаблон замедлителя Camel на втором маршруте для достижения цели.

Задержка (длинная), в которой аргумент указывает время в миллисекундах. You can read more abuout this pattern here

Для примера; from("seda:processIt").delay(2000) .to("bean:firstProcessingBean"); // Задерживает этот маршрут на 2 секунды

Я бы предложил использовать startupOrder, чтобы настроить запуск маршрута. Официальная документация содержит хорошие сведения по этой теме. Kindly read it here

Точка для заметок - сначала начинаются маршруты с самым низким начальным запуском. Все начальные значения должны быть уникальными среди всех маршрутов в вашем CamelContext. "

Итак, я хотел бы предложить что-то вроде этого -

from("endpoint1").startupOrder(1) 
.to("endpoint2"); 


from("endpoint2").startupOrder(2) 
.to("endpoint3"); 

Надежда, которая помогает ..

PS: Я новичок в Apache Camel и StackOverflow, а также. Прошу прощения за любую ошибку, которая могла произойти.

+0

Я не могу потому что я не знаю, как долго будет обрабатываться обработка seda. Указание порядка запуска также не будет работать здесь, потому что второй маршрут (из («seda: ...») запускается по первому маршруту. – mike27

+0

Решение Claus отлично работает в вашем случае. :) Такая синхронизация часто возникает во время используя верблюжий маршрут, и даже я все еще изучаю больше техник, пока я иду. На данный момент я использую прямой компонент больше, чем что-либо, чтобы работать как триггеры синхронизации. – U2one

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