java - Camel收件人列表不迭代所有收件人

标签 java apache-camel

我正在编写一个 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() ?是我的分路器有问题,还是我的收件人列表有问题?

最佳答案

.recipientList(exchangeProperty(...))
   .log(LoggingLevel.INFO, String.format("Calling ${in.header.%s}", Exchange.RECIPIENT_LIST_ENDPOINT));

您将日志语句放在了错误的位置。 基本上,您对路线进行建模的方式是: “请将消息发送给所有收件人,然后之后打印一条消息”。事实上,在循环查看收件人列表后,Camel 变量保存了LAST收件人的 URI。

在 Spring DSL 中更加明显:

你的Camel路线正在做什么:

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

与您认为的 Camel 所做的相比:

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

关于java - Camel收件人列表不迭代所有收件人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55043676/

相关文章:

java - Apache Camel 上下文删除路由定义方法

java - 为什么盒装原语不支持所有运算符?

java - Windows ANT Build : invalid CEN header (bad signature) 上的 CVS checkout

java - Gradle JavaExec 提示无法加载或找到主类

apache-camel - Apache Camel 和 Apache Airflow 有重叠吗?它们如何比较?

java - 如何在运行时在 Spring Boot 应用程序下将添加/删除路由更新到 Apache Camel 中?

java - 谷歌云存储 : Could not initialize class OauthRawGcsServiceFactory

java 1.5 和 java 1.6 之间的 java.sql.Connection 兼容性问题

java - 在 Camel 2.12 中禁用 camel 证书验证

java - Camel-salesforce-maven-plugin 生成无法编译的代码