1

Мне нужно создать маршрут, который периодически вызывает некоторый процесс с небольшой задержкой между итерациями.Бесконечный цикл в Apache Camel

Когда я смотрю на документацию для зацикливания:

The Loop позволяет обработку сообщения несколько раз, возможно, по-другому для каждой итерации. Полезен в основном во время тестирования.

Так что это не полезно для меня, так как мне нужно сделать бесконечный цикл (без явно заданного CamelLoopSize).

Моя вторая идея использования своего рода «рекурсии»:

from("direct:updateLoop").routeId("updateLoop") 
    .process(someProcess) 
    ... 
    .filter(someFilter) // Can be used to stop the workflow 
    .delay(18000000) // Wait 5 hours and start again 
    .to("direct:updateLoop") 

Это хорошо работает в течение нескольких дней, однако после того, как около 600 итераций, это не удается с StackOverflowException

Есть ли лучший способ запустить мой процесс в бесконечном цикле?

+1

Почему бы не использовать компонент кварца или таймера? –

+0

Потому что я не могу заранее определить, сколько времени займет процесс. Процесс может занять несколько минут или несколько дней. Когда я настраиваю только таймер, будет возможность одновременной обработки одного и того же набора данных. Настройка задержки просто подходит для моего варианта использования. – Peter

+0

Как насчет опроса потребительского рисунка? – vikingsteve

ответ

2

Для рекурсии вы можете использовать seda компонент верблюда.

from("seda:updateLoop").routeId("updateLoop") 
    .process(someProcess) 
    ... 
    .filter(someFilter) // Can be used to stop the workflow 
    .delay(18000000) // Wait 5 hours and start again 
    .to("seda:updateLoop"); 
+1

У меня есть преимущество, потому что это решение для очень длительной обработки - я имею в виду, что у меня было много данных, которые были перенесены с помощью верблюда из пункта назначения А в пункт назначения B, до тех пор, пока в A не появится что-то. Это вызвало stackoverflow, только потому, что стек был слишком долго (без рекурсии!) – Cipous