Rabbitmq发送方消息确认

一、发送方消息确认点

都知道发送方消息确认,有两个地方

  • 消息发送到broker的消息确认回调,发送到服务器,触发confirmCallBack ,ack=true 否 false
  • 消息通过交换器绑定到队列的消息确认回调,发现没有与之绑定的队列时,触发returnCallBack

二、配置

2.1、yml

 #rabbitmq
  rabbitmq:
    host: 192.168.99.12
    port: 5672
    username: guest
    password: guest
    # 发送确认
    publisher-confirms: true
    # 路由失败回调
    publisher-returns: true
    template:
      # 必须设置成true 消息路由失败通知监听者,false 将消息丢弃
      mandatory: true

2.2、回调配置

回调配置是配置给RabbitTemplate的,一个是confirmCallBack一个是returnCallBack,根据面向搜索引擎编程规则,网上搜,你会发现零零散散,残缺不齐,还是得自己造轮子,不BB了,上代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;

/**
 * rabbitmq 模版配置发送确认
 * @author  DUCHONG
 * @since 2020-08-21 10:15:31
 */
@Configuration
@Slf4j
public class RabbitTemplateConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void setConfirmAndReturnCallBack() {
        //设置ConfirmCallback
        rabbitTemplate.setConfirmCallback(confirmCallback());
        //设置ReturnCallback
        rabbitTemplate.setReturnCallback(returnCallback());
    }


    /**
     * ReturnCallback接口用于实现消息发送到RabbitMQ交换器,但无相应队列与交换器绑定时的回调
     message   投递失败的详细信息
     replyCode   回复的状态码
     replyText   回复的文本内容
     exchange     这个消息发送给哪个交换机
     routingKey    这个消息用的哪个路由键
     */
    RabbitTemplate.ReturnCallback returnCallback(){
        return (message, replyCode, replyText, exchange, routingKey) -> {
            //业务逻辑
            log.info("returnCallback---->message---{},-->replyCode---{},-->replyText---{},-->exchange---{},-->routingKey---{}", message, replyCode, replyText, exchange, routingKey);
        };
    }

    /**
     * ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后接收ack回调
     correlationData 消息的唯一id,给每一条信息添加一个dataId,放在CorrelationData,这样在RabbitConfirmCallback返回失败的时候可以知道是哪个消息失败
     ack 消息是否成功收到 true 收到 false 未收到
     cause  失败原因
     */
    RabbitTemplate.ConfirmCallback confirmCallback(){
        return (correlationData, ack, cause) ->{
            //业务逻辑
            log.info("confirmCallback---->correlationData---{},-------->ack---{},-------->cause---{}",correlationData,ack,cause);
        };
    }
}

 

posted @ 2020-08-21 10:41  npe0  阅读(781)  评论(0编辑  收藏  举报