【问题标题】:Camel recipientList not iterating all recipients骆驼收件人列表没有迭代所有收件人
【发布时间】:2019-03-07 12:21:37
【问题描述】:

我正在编写一个 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();

在上面的sn-p中,属性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));

在上面的sn-p中,参数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() 吗?是我的拆分器有问题,还是我的收件人列表有问题?

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:
    .recipientList(exchangeProperty(...))
       .log(LoggingLevel.INFO, String.format("Calling ${in.header.%s}", Exchange.RECIPIENT_LIST_ENDPOINT));
    

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

    在 Spring DSL 中更明显:

    你的骆驼路线在做什么:

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

    相对于你认为 Camel 正在做的事情:

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

    【讨论】:

    • 这很有意义,我会在我回来工作时测试这个。同时,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2016-10-23
    • 2016-05-21
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多