文章目录
发布确认-高级
本节内容与之前章节:(四、RabbitMQ之发布确认模式)不冲突,这是在springboot中整合RabbitMQ的操作,之前是直接操作rabbitmq。
在生产环境中由于一些不明原因,导致 rabbitmq服务器 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投递呢? 特别是在比较极端的情况:RabbitMQ 集群不可用的时候,无法投递的消息该如何处理呢?
应 用 [xxx] 在 [08-1516:36:04] 发 生 [ 错 误 日 志 异 常 ] , alertId=[xxx] 。 由
[org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:start:620] 触 发 。
应用 xxx 可能原因如下
服 务 名 为 :
异 常 为 : org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:start:620,
产 生 原 因 如 下 :1.org.springframework.amqp.rabbit.listener.QueuesNotAvailableException:
Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it.||Consumer received fatal=false exception on startup:
1、发布确认 springboot 版本
1.1. 确认机制方案
加个缓存,有两个地方可能收不到消息,一个是交换机,另外一个是队列。

1.2. 代码架构图

1.3. 配置文件
在配置文件当中需要添加:spring.rabbitmq.publisher-confirm-type=correlated
- NONE :禁用发布确认模式,是默认值
- CORRELATED :发布消息成功到交换器后会触发回调方法
- SIMPLE
- 经测试有两种效果,其一效果和 CORRELATED 值一样会触发回调方法,
- 其二在发布消息成功后使用 rabbitTemplate 调用 waitForConfirms 或 waitForConfirmsOrDie 方法
等待 broker 节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie 方法如果返回 false 则会关闭 channel,则接下来无法发送消息到 broker(这就是之前的同步发布确认)
# rabbitMQ所在服务器的ip地址
spring.rabbitmq.host=192.168.80.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123
# 开启发布确认
spring.rabbitmq.publisher-confirm-type=correlated
1.4. 添加配置类
package com.wlw.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 发布确认-高级:
* 配置类
*/
@Configuration
public class ConfirmConfig {
//交换机名字
public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
//队列名字
public static final String CONFIRM_QUEUE_NAME = "confirm.queue";
//routingKey
public static final String CONFIRM_ROUTING_KEY = "key1";
// 声明业务 Exchange
@Bean("confirmExchange")
public DirectExchange confirmExchange(){
return new DirectExchange(CONFIRM_EXCHANGE_NAME);
}
// 声明队列
@Bean("confirmQueue")
public Queue confirmQueue(){
return QueueBuilder.durable(CONFIRM_QUEUE_NAME).build();
}
// 绑定:交换机与队列
@Bean
public Binding queueBinding(@Qualifier("confirmQueue") Queue confirmQueue,
@Qualifier("confirmExchange") DirectExchange confirmExchange){
return BindingBuilder.bind(confirmQueue).to(confirmExchange).with(CONFIRM_ROUTING_KEY);
}
}
1.5. 消息生产者
package com.wlw.rabbitmq.controller;
import com.wlw.rabbitmq.config.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframewo

本文详细讲解了如何在SpringBoot应用中实现RabbitMQ的发布确认功能,包括确认机制、回退消息处理、备份交换机的应用,以及生产者和消费者的实现。重点讨论了如何确保消息的可靠投递和处理异常情况。
最低0.47元/天 解锁文章
1584

被折叠的 条评论
为什么被折叠?



