(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);
}
}
猜你喜欢
official
799
上一篇文章《(mq)rabbitmq消息发送确认》介绍了消息发布时的确认方案,本篇文章将介绍,消息消费确认的方法。和确认发布一样,消费者有时也需要确认,rabbitmq有三种确认模式
weblog
2564
某些情形中如果想要实现前端页面刷新,那么一个比较好的办法就是用websocket实现。应该是比ajax轮询要好吧~。既然是websocket主动推送消息,那么服务端查询和推送消息的时机就很重要,也就
blog
mqtt 协议中的 QoS等级介绍
mqtt协议
3759
一次;QoS1,Atleastonce,至少一次;QoS2,Exactlyonce,确保只有一次; QoS是消息的发送方(Sender)和接受方(Receiver)之间达成的一个协议:QoS0代表,S
blog
阿里云服务器发送邮件失败
工具
2327
阿里云esc服务器为了安全默认禁用25端口,所以会导致JavaMail发送邮件失败。错误代码
blog
mqtt 协议报文解析
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(死信
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。