13 死信队列

1 图解

死信队列

2 消息如何进入死信队列

消息过期
队列长度已满
消息被拒绝且不再重新尝试

3 应用场景

在定义业务队列时,指定一个死信交换机,并绑定一个死信队列
当消息变成死信时,该消息就会被发送到该死信队列上
这样就方便我们查看消息失败的原因

4 代码样例

4.1 生产者


/**
* 定义死信队列相关信息
 */
public final static String deadQueueName = "dead_queue";
public final static String deadRoutingKey = "dead_routing_key";
public final static String deadExchangeName = "dead_exchange";
/**
 * 死信队列 交换机标识符
 */
public static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
/**
 * 死信队列交换机绑定键标识符
 */
public static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";

// 邮件队列
private String FANOUT_EMAIL_QUEUE = "fanout_queue";
	
/**
* 配置死信队列
 * 
 * @return
 */
@Bean
public Queue deadQueue() {
	Queue queue = new Queue(deadQueueName, true);
	return queue;
}

/*
* 创建死信交换机
*/
@Bean
public DirectExchange deadExchange() {
	return new DirectExchange(deadExchangeName);
}

/*
* 将死信队列与死信交换机绑定
*/
@Bean
public Binding bindingDeadExchange(Queue deadQueue, DirectExchange deadExchange) {
	return BindingBuilder.bind(deadQueue).to(deadExchange).with(deadRoutingKey);
}

/**
* 声明业务队列,将死信交换机与队列进行绑定
 * @return Queue 
 */
@Bean
public Queue fanOutQueue() {
	Map<String, Object> args = new HashMap<>(2);
	args.put(DEAD_LETTER_QUEUE_KEY, deadExchangeName);
	args.put(DEAD_LETTER_ROUTING_KEY, deadRoutingKey);
	return new Queue(FANOUT_EMAIL_QUEUE, true, false, false, args);
}

4.2 消费者

try {
	// 通知mq服务器删除该消息
	channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
	// 消息放入死信队列
	channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}

5 注意事项

如果创建队列时,未绑定死信交换机,如果想要绑定,需要将队列删除,重新创建
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值