Как использовать компонент Camel JDBC без таймера

Я делаю Apache Camel PoC в моем проекте. Я застрял в одной проблеме при использовании компонента Camel JDBC.

Я могу читать из базы данных с компонентом JDBC. Но мне нужно всегда использовать компонент Timer. Согласно документации Camel, компонент JDBC нельзя использовать в операторе from(). Я попытался использовать компонент Direct в операторе from(), как указано в документации, но он не работает.

Ниже мой код:

from("direct:zh_ICS_Test")
//from("timer://myTimer?period=2s")
  .setBody(constant("select * from ZH_ICS_TEST"))
  .to("jdbc:myDataSource")
  .split(body())
  .convertBodyTo(String.class)
  .to("file://" + dst);

Ниже вывод консоли:

[main] INFO org.apache.camel.impl.DefaultCamelContext - запускается Apache Camel 2.12.1 (CamelContext: camel-1) [main] INFO org.apache.camel.management.ManagedManagementStrategy - JMX включен [main] INFO org.apache.camel.impl.converter.DefaultTypeConverter - Загруженные конвертеры 176 типов [основная] ИНФОРМАЦИЯ org.apache.camel.impl.DefaultCamelContext - StreamCaching не используется. Если используются потоки, рекомендуется включить потоковое кэширование. Подробности см. На http://camel.apache.org/stream-caching.html [main] ИНФОРМАЦИЯ org.apache.camel.impl.DefaultCamelContext - Маршрут: маршрут1 запущен и используется из: конечной точки [direct://zh_ICS_Test] [main] INFO org.apache.camel.impl.DefaultCamelContext - Всего 1 маршрут, из которых 1 запущен. [главная] ИНФОРМАЦИЯ org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: camel-1) запустился за 0,798 секунды [главная] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: верблюд-1) завершает работу [главная] ИНФОРМАЦИЯ org.apache.camel.impl.DefaultShutdownStrategy - Начало постепенного отключения 1 маршрута (время ожидания 300 секунд) [Поток верблюда (верблюд-1) № 1 - ShutdownTask] ИНФОРМАЦИЯ org. apache.camel.impl.DefaultShutdownStrategy - Маршрут: завершение работы по завершению маршрута 1, использование из: конечной точки [direct://zh_ICS_Test] [main] INFO org.apache.camel.impl.DefaultShutdownStrategy - постепенное завершение 1 маршрута, выполненного за 0 секунд [ main] ИНФОРМАЦИЯ org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: camel-1) время безотказной работы 5,818 секунд [главная] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: верблюд-1) выключается за 0,016 секунды

Приведенный выше код работает, если я использую таймер вместо прямого компонента. Я не хочу использовать Timer всегда и просто должен выполнить мой запрос один раз. Я использую Camel 2.12.1 с JDK7.

Может кто-нибудь, пожалуйста, помогите?

2 ответа

Поведение, которое вы описываете, нормальное. У вас есть только один маршрут с direct component для от.

В этом случае ничего не произойдет, если вы программно не отправите Exchange на этот прямой компонент.

Посмотрите, что говорит доктор верблюд:

Компонент direct: обеспечивает прямой синхронный вызов любых потребителей, когда производитель отправляет обмен сообщениями. Эту конечную точку можно использовать для подключения существующих маршрутов в том же контексте верблюда.

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

При использовании компонента таймера обмен не требуется, поскольку он генерируется компонентом:

Компонент timer: используется для генерации обмена сообщениями при срабатывании таймера. Вы можете использовать события только с этой конечной точки.

Если вы хотите придерживаться direct: Вы должны отправить обмен с to("direct:zh_ICS_Test") как-то.

Вы можете использовать любую конечную точку для ее запуска:

from("...").to("direct:zh_ICS_Test");

Если вы планируете запускать маршрут через регулярные промежутки времени, вы можете использовать для этого Кварцевый компонент (ознакомьтесь с документацией по реализации):

from("quartz://myGroup/myTimerName?trigger.repeatInterval=2000&trigger.repeatCount=5").to("direct:zh_ICS_Test");
Другие вопросы по тегам