Верблюдский получательСписок не повторяет всех получателей - PullRequest
1 голос
/ 07 марта 2019

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

Маршрут начинается с получения всех запросов, расположенных в папке, а затем использует разделитель для их итерации по порядку:

from("quartz2:quartzInitializer?cron={{sync.cron}}")
    .routeId("quartzInitializer")
    .bean(QueryHandler.class, "getQueries")
    .split(exchangeProperty(QueryHandler.Properties.QUERIES))
        .setProperty(Properties.CURRENT_QUERY, simple("body"))
        .to("direct:executeSingleQuery")
    .end();

В приведенном выше фрагменте свойство QueryHandler.Properties.QUERIES содержит два местоположения файла запроса:

config/sql/1__select_stat_machine.sql
config/sql/2__select_stat_session.sql

Затем я отправляю местоположение повторного запроса и строю из него список получателей:

from("direct:executeSingleQuery")
    .routeId("executeSingleQuery")
    .bean(DataSourceHandler.class, "createEndpointsWithQuery")
    .recipientList(exchangeProperty(DataSourceHandler.Properties.QUERY_RECIPIENTS))
        .parallelProcessing()
    .log(LoggingLevel.INFO, String.format("Calling ${in.header.%s}", Exchange.RECIPIENT_LIST_ENDPOINT));

В приведенном выше фрагменте параметр DataSourceHandler.Properties.QUERY_RECIPIENTS содержит двух получателей:

sql:file:config/sql/1__select_stat_machine.sql?dataSource=datasource3&outputHeader=resultset
sql:file:config/sql/1__select_stat_machine.sql?dataSource=datasource2&outputHeader=resultset

Однако, когда я запускаю это, вызывается только один из получателей, в этом случае только datasource2, который был с индексом 1 в списке, передаваемом в список получателей:

Calling sql://file:config/sql/1__select_stat_machine.sql?dataSource=datasource2&outputHeader=resultset
Calling sql://file:config/sql/2__select_stat_session.sql?dataSource=datasource2&outputHeader=resultset

Я не могу на всю жизнь понять, что я делаю неправильно. Я где-то пропускаю end()? Мой сплиттер виноват или это мой список получателей?

1 Ответ

2 голосов
/ 09 марта 2019
.recipientList(exchangeProperty(...))
   .log(LoggingLevel.INFO, String.format("Calling ${in.header.%s}", Exchange.RECIPIENT_LIST_ENDPOINT));

Вы помещаете запись в журнал не в том месте. В основном вы смоделировали свой маршрут: Msgstr "Пожалуйста, отправьте сообщения всем получателям, и ПОСЛЕ этого распечатайте сообщение". Дело в том, что после прохождения списка получателей переменная Camel содержит URI LAST получателя.

Это более очевидно в Spring DSL:

Что делает ваш верблюжий маршрут:

<recipientList>
  <header>...</header> 
</recipientList>
<log message="Done"/>

против того, что, по вашему мнению, делает Верблюд:

<recipientList>
  <header>...</header>
  <log message="Done"/>  
</recipientList>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...