一、死信队列
1.1、概述
上一篇介绍了RocketMQ中的消息重试机制,我们可以知道当消息重试了一定的次数后,将不再继续重试,那么这个未被消费者成功消费的消息去了哪里了?带着这个问题,我们开始本章的学习。死信队列是一种特殊的队列,专门用于存放因消费者端无法正常消费的消息,例如上一篇文章中介绍中的消息由于无法成功被消费,最终进入了死信队列,具体进入的死信队列如下:
1.2、死信队列的Topic
死信队列的Topic是由以下两部分组成的,格式为:%DLQ%${消费者组},如:%DLQ%retry-consumer-group
1.3、如何查看死信队列中的消息
方式一:
dashboard控制面板===>消息===>Topic===>选择死信队列主题 & 区间。
方式二:
dashboard控制面板===>主题===>勾选死信===>刷新。
1.4、如何消费死信队列中的消息
/**
* 消费死信队列中的消息
*
* @throws Exception
*/
@Test
public void demo9RetryDeadConsumer() throws Exception {
// 1、创建一个消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("retry-dead-consumer-group");
// 2、连接NameServer
consumer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 3、订阅消息,*表示订阅该主题所有的消息
consumer.subscribe("%DLQ%retry-consumer-group", "*");
// 4、设置监听器(采用异步回调方式,一直监听)
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
// 业务处理
for (MessageExt message : messages) {
log.info("将该条消息记录到MySQL | Redis | 通知人工处理...,消息内容:{}",StrUtil.utf8Str(message.getBody()));
}
/**
* 返回值:消费消息成功与否
* CONSUME_SUCCESS:表明消费成功,消息会从MQ出队
* RECONSUME_LATER:表明消费失败,消息会重新回到队里,过一会儿再重新投递出来给当前消费者或者其他消费者
* 什么时候消费者会重试?
* (1)业务报错了
* (2)返回null
* (3)返回RECONSUME_LATER
*/
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 5、启动
consumer.start();
log.info("【demo9RetryDeadConsumer】启动成功,正在等待接收消息...");
// 6、挂起当前JVM
System.in.read();
}