RabbitMQ高级篇
一、消息可靠性投递
在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息消失或者投递失败场景。RabbitMQ为我们提供了两种方式用来控制消息的投递可靠性模式。
消息传递机制:
最多一次,一位消息有可能丢失
最少一次,保证消息传递可靠,但可能冗余
保证值成功一次,性能最差,消息成功传递,不冗余
消息投递步骤:
生产者(channel)------->交换机------>队列
确保消息的可靠性投递,提供了如下的两种方式
confirm 确认模式
return 回退模式
(1)确认模式
# none:禁用发布确认模式
# correlated:发布消息成功到交换机后触发回调方法
# simple:有两种效果
(1)和CORRELATED值一样会触发回调方法
(2)在发布消息成功后使用rabbitTemplate调用waitForConfirms或 waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回 结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如 果返回false则会关闭channel,则接下来无法发送消息到broker;
必须开启确认模式
# 端口号
server:
port: 8087
spring:
rabbitmq:
host: 192.168.31.129
# none:禁用发布确认模式
# correlated:发布消息成功到交换机后触发回调方法
# 开启rabbitMQ的生产方确认模式
publisher-confirm-type: correlated
设置RabbitTemplate的确认回调函数
package com.hong;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author hongCheng
* @Date 2021/4/21 19:52
* @Version 1.0
*/
@SpringBootTest
public class ConfirmModel {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testConfirm(){
/**
* 保证发送方到交换机的可靠性
* 1.开启confirm模式,publisher-confirm-type:correlated
* 2.设置rabbitTemplate的确认回调函数,如果消息到达交换机则返回true
* 否则返回false
*/
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
* correlationData 回调函数的相关数据
* ack 自动确认
* cause 原因如果存在,则为nack,否则null
* @param correlationData
* @param ack
* @param cause
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack==false){
System.out.println("继续发现消");
//取消订单
}