Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Новое и улучшенное
Постоянная ссылка 06-10-2010 anydoby java camel

В Camel 2.4.0 появилась одна забавная фича, которая поломала все Quartz руты в нашем проекте:


Introduced StartupListener to allow components/endpoints/producers/consumers etc. as a listener to be notified when CamelContext have just been started. This allows any custom logic to be executed as a late starter. This ensures Quartz scheduler is only started when all the routes and so forth is started and running.

Проблема вот в чем, если в CamelContext изначально нет маршрутов с Quartz, то вы никогда его не увидите, потому что QuartzComponent.startScheduler вызывается один раз и только после того как все маршруты в контекст добавлены. Метод startScheduler проверяет private static Scheduler на предмет null и если да, то ничего не делает. Фокус в том, что scheduler заполняется только один раз (оно статическое) во время выполнения doStart. А это уже поздновато. Да, объект есть, но никто его уже не стартует, поэтому все Quartz маршруты молчат.

Для тех, кому очень-очень нужно, вот простое решение, на случай если у вас маршруты добавляются в контекст динамически:


    <camel:camelContext id="camelContext" handleFault="true" streamCache="false" trace="true" autoStartup="true">
      <camel:route>
        <camel:from uri="quartz://dummy/dummytrigger?fireNow=true"/>
        <camel:to uri="mock:something"/>
      </camel:route>
    </camel:camelContext>

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

Надеюсь, Клаус сможет состряпать нормальный фикс после вышесказанного :)

Добавить комментарий

Предыдущая статья Camel. Как следить за изменениями в файле. Следующая статья Автоматическое выравнивание изображений