骆驼收件人列表未遍历所有收件人

时间:2019-03-07 12:21:37

标签: 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()吗?我的拆分器有问题吗,还是我的收件人列表?

1 个答案:

答案 0 :(得分:2)

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

您将log语句放在错误的位置。 基本上,您对路线进行建模的方式是: “请将邮件发送给所有收件人,然后之后打印邮件”。事实是,在遍历收件人列表之后,骆驼变量保存 LAST 收件人的URI。

在Spring DSL中更明显:

您的骆驼路线正在做什么:

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

与您认为骆驼的行为相反:

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