SQL组件:使用多个行,并将它们全部标记为使用onConsume处理

时间:2018-08-14 19:42:25

标签: apache-camel camel-sql

我将骆驼sql组件配置为从数据库表中读取数据。我每次读取一行时都具有“ onConsume”参数,但是当我尝试使用“ maxMessagesPerPoll”一次读取多行时却不起作用。这是我尝试过的...

工作:一次读取一行并使用onConsume更新该行。

我的消费者端点uri看起来像:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID =:#REPORT_ID

不起作用::当我配置骆驼的sql组件以读取可配置的行时(使用“ maxMessagesPerPoll”)。它一次读取多行,但是onConsume似乎不起作用。我试图告诉骆驼使用IN运算符,并使用IN子句的值数组设置标头值(REPORT_ID)。

我的消费者端点uri现在看起来像:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&maxMessagesPerPoll=3&consumer.useIterator=false&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID in(:#REPORT_ID)

我可能在这里做错了。我已经对此进行了足够的搜索,并找到了相关的post1post2。但这并不能使我走上正确的道路。

我需要能够将所有消耗的行标记为IS_VIOLATED ='N'。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

通过仔细查看apache sql component doc

我尝试使用属性“ processingStrategy”`实现自定义处理策略。

public class ReportProcessingStratergy implements SqlProcessingStrategy {
@Override
public int commit(DefaultSqlEndpoint defaultSqlEndpoint, Exchange exchange, Object o, JdbcTemplate jdbcTemplate, String s) throws Exception {
    s = s.replace("?","5066834,5066835,5066832");
    return jdbcTemplate.update(s);
}

@Override
public int commitBatchComplete(DefaultSqlEndpoint defaultSqlEndpoint, JdbcTemplate jdbcTemplate, String s) throws Exception {
    return 0;
}

}

配置spring bean:

  <bean class="go.ga.ns.reconc.sl.ReportProcessingStratergy" id="reportProcessingStratergy">

现在我的sql使用者端点uri看起来像:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&maxMessagesPerPoll=3&consumer.useIterator=false&&processingStrategy=#reportProcessingStratergy&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID in(?)

注释:processingStrategy =#reportProcessingStratergy(#具有here所述的意义,但无法解决)

答案 1 :(得分:0)

我注意到您设置了consumer.useIterator=false,文档显示:

  

如果为true,则将单独处理轮询时返回的每一行。如果为false,则将整个java.util.List数据设置为IN主体。

所以我认为由于这个选项,:#REPORT_ID不再被理解,因为它将来自整个列表,而不是来自每一行。

也许删除该选项就足够了。

我也不明白您为什么将where子句从where REPORT_ID =:#REPORT_ID更改为where REPORT_ID in(:#REPORT_ID)