问题遇到的现象和发生背景
当消费 msgs 数组时, 处理其中一条消息报错。如果返回ConsumeOrderlyStatus.RECONSUME_LATER, 那么数组其它的消息怎办?都被retry吗?
假如,msgs有3条消息, 处理第1条成功,第2条时,失败了,返回了RECONSUME_LATER。
那么问题来了, 问题1) 3条消息都重试,那么第1条已经处理过了,(例如已入库, 要作幂等性控制?) 问题2)第3条 会被错杀? 问题3, 第3条重试时,也许再次被错杀
问题相关代码,请勿粘贴截图
consumer.registerMessageListener(new MessageListenerOrderly() {
Random random = new Random();
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
context.setAutoCommit(true);
for (MessageExt msg : msgs) {
try {
//模拟业务逻辑处理中...
TimeUnit.SECONDS.sleep(random.nextInt(10));
} catch (Exception e) {
e.printStackTrace();
return ConsumeOrderlyStatus.RECONSUME_LATER;
}
}
return ConsumeOrderlyStatus.SUCCESS;
}
});