系列十四、死信队列

一、死信队列

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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值