我将骆驼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)
我可能在这里做错了。我已经对此进行了足够的搜索,并找到了相关的post1,post2。但这并不能使我走上正确的道路。
我需要能够将所有消耗的行标记为IS_VIOLATED ='N'。
感谢您的帮助。
答案 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)
。