(mq)rabbitmq消息发送确认

weblog 846 0 0

消息发送确认

在使用mq发送消息的时候,由于一些不确定因素,可能会导致消息发送失败,比如网络的问题,服务器问题,或mq本身的问题都可能会导致消息发送失败。那么当消息发送成功或失败后程序如何感知呢?那就是通过回调方法,无论消息发送到交换机是否成功,或是否成功路由到队列,都会通过回调方法来感知这些事件。

配置文件修改

spring:
  rabbitmq:
    publisher-confirm-type: correlated # 发布确认模式,发布消息成功到交换机后会触发回调方法
    publisher-returns: true # 消息路由失败后会回调方法

ConfirmCallback接口

通过实现 ConfirmCallback 接口,消息发送到 Broker 后触发回调,确认消息是否到达 Broker 服务器,也就是只确认是否正确到达 Exchange(交换机) 中。

ReturnCallback接口

通过实现 ReturnCallback 接口,启动消息路由失败返回,比如路由不到队列时触发回调对应方法。

配置类

package club.jiajiajia.rabbitmq.provider.confirm;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @ClassName MessageConfirmCallback
 * @Author Jiajiajia
 * @Date 2021/8/29 20:17
 * @Description 消息发送到交换机回调confirm方法,当交换机路由不到相应的队列回调returnedMessage方法
 **/
@Component
public class MessageConfirmCallback implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnCallback{

    @Resource
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init() {
        //指定 ConfirmCallback
        rabbitTemplate.setConfirmCallback(this);
    }

    /**
     * 消息发送到交换机时,回调此方法
     * @param correlationData 发送时传入的数据
     * @param ack true代表发送成功,false代表发送失败
     * @param cause 失败原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息唯一标识:" + correlationData);
        System.out.println("确认结果:" + ack);
        System.out.println("失败原因:" + cause);
    }

    /**
     * 只有消息路由失败的时候才会回调此方法
     * @param message 消息主体
     * @param replyCode 失败码
     * @param replyText 失败愿意
     * @param exchange 交换机
     * @param routingKey 路由键
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("消息主体 message : "+message);
        System.out.println("消息主体 message : "+replyCode);
        System.out.println("描述:"+replyText);
        System.out.println("消息使用的交换器 exchange : "+exchange);
        System.out.println("消息使用的路由键 routing : "+routingKey);
    }
}

 


猜你喜欢
official 799 上一篇文章《(mq)rabbitmq》介绍了布时的方案,本篇文章将介绍,的方法。和布一样,费者有时也需要,rabbitmq有三种模式
weblog 2564 某些情形中如果想要实现前端页面刷新,那么一个比较好的办法就是用websocket实现。应该是比ajax轮询要好吧~。既然是websocket主动推,那么服务端查询和推的时机就很重要,也就
mqtt协议 3759 一次;QoS1,Atleastonce,至少一次;QoS2,Exactlyonce,保只有一次;  QoS是方(Sender)和接受方(Receiver)之间达成的一个协议:QoS0代表,S
工具 2327 阿里云esc服务器为了安全默禁用25端口,所以会导致JavaMail邮件失败。错误代码
mqtt协议 1613 止保留CONNECT1客户端到服务端客户端请求连接服务器CONNACK2服务端到客户端连接报文PUBLISH3双向PUBACK4双向QoS1布收到PUBREC5双向布收到(保证
official 767 RabbitMQ作为一个队列提供一个通用的和接收平台,并且保证在传输过程中的安全可靠。(Message)由Client,RabbitMQ接收到之后通过交换机转到对应的队
nginx 2278 情景websocket服务端经nginx代理,刷新页面连接正常,大约经过60秒没有,websocket自动断开连接,控制台打印错误码为1006。 原因在经过nginx代理时,nginx会检测
official 751 什么是死信队列?死信队列:DLX,dead-letter-exchange利用DLX,当在一个队列中变成死信(deadmessage)之后,它能被重新publish到另一个Exchange(死信
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。