Я пишу интеграцию 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()
? Мой сплиттер виноват или это мой список получателей?