0

我将骆驼 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' 。

谢谢你的帮助。

4

2 回答 2

0

我注意到你设置consumer.useIterator=false了,文档说:

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

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

也许删除这个选项就足够了。

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

于 2018-11-26T20:33:12.880 回答
0

通过仔细查看apache sql 组件文档

我尝试使用属性“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;
}

}

配置弹簧豆:

  <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(# 有此处解释的意义,没有它就不起作用)

于 2018-08-14T22:30:04.057 回答