RabbitMQ--发布确认高级版
Posted Mr...Gan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ--发布确认高级版相关的知识,希望对你有一定的参考价值。
一、概念
1、目的
在Rabbit MQ宕机或者重启时保证消息不会丢失。
2、结构
3、做法
发送给交换机信息时,交换机收到会给生产者发送接收到的消息,没有成功则发送没有成功的消息。
如果消息没有到达目的地,会提示上传者发送消息未达。
二、实例代码
1、配置文件的主要参数:publisher-confirm-type(发布确认模式更改。)、publisher-returns(回退接口开启)
server:
port: 8081
# rabiitmq 配置
spring:
rabbitmq:
host: 192.168.0.101
port: 5672
username: admin
password: 123
# 发布确认模式:none:默认。correlated:发送到交换机后会触发回调函数回调;SIMPLE:
publisher-confirm-type: correlated
#回退接口,消息穿不到目的时回退
publisher-returns: true
2、RabbitMQ回退配置文件
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback
@Autowired
private RabbitTemplate rabbitTemplate;
//注入到RabbitTemplate.ConfirmCallback方法中
@PostConstruct
public void init()
//注入
rabbitTemplate.setConfirmCallback(this::confirm);
//注入+1
rabbitTemplate.setReturnsCallback(this::returnedMessage);
//correlationData:消息相关数据
//b:交换机是否到消息
@Override
public void confirm(CorrelationData correlationData, boolean b, String s)
String id=correlationData!=null?correlationData.getId():"";
if(b)
System.out.println("交换机已经收到id为:"+id+"的消息");
else
System.out.println("交换机未收到id为:"+id+"的消息,由于原因+"+s);
//在消息传递过程中不可达目的时,将消息返回给上传者。只有不可达时才回退
@Override
public void returnedMessage(ReturnedMessage returnedMessage)
System.out.println("消息不可达到目的。\\r\\n" +
"消息:"+new String(returnedMessage.getMessage().getBody())+
"\\r\\n原因:"+returnedMessage.getReplyText()+
"\\r\\n路由:"+returnedMessage.getRoutingKey());
3、生产者。主要参数:CorrelationData
@GetMapping("/test")
public String getTest()
//回调函数参数。
CorrelationData correlationData=new CorrelationData("id");
rabbitTemplate.convertAndSend(TestConfig.NAME_EXCHANGE,TestConfig.NAME_KEY,"666",correlationData);
return "成功";
4、RabbitMQ的配置类和接收者类与普通模式无异。
5、测试。测试交换机:更改上传者发送的交换机名称。测试信道:同理
三、备份交换机
1、目的
当原有交换机不可用时,备用交换机自动转发原交换机的信息。
2、结构图
3、做法
多加一个交换机和队列。在失败的回调方法中进行转发消息。
以上是关于RabbitMQ--发布确认高级版的主要内容,如果未能解决你的问题,请参考以下文章