(mq)rabbitmq消息发送确认
消息发送确认
在使用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);
}
}
fixed
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。