RabbitMQ提供了两种方式类控制消息投递的可靠性模式
1、Confirm —确认模式(ConfirmCallback)
2、Return —回退模式(ReturnCallback)
rabbitMQ整个消息投递流程:(这两种方式即可保证消息投递可靠性)
Spring.xml中的配置:
<!-- 定义rabbitmq connectionFactory -->
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"
publisher-confirms="true"
publisher-returns="true"
/>
<!--定义管理交换机、队列-->
<rabbit:admin connection-factory="connectionFactory"/>
<!--消息可靠性投递处理 (生产端)-->
<rabbit:queue id="test_queue_confirm" name="test_queue_confirm" />
<rabbit:direct-exchange name="spring_exchange_confirm">
<rabbit:bindings>
<rabbit:binding queue="test_queue_confirm" key="confirm"/>
</rabbit:bindings>
</rabbit:direct-exchange>
测试代码:
package com.study;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @Author hekunming
* @Date 2021/11/19 21:24
* @Copyright
*/
//@RunWith ---就是一个运行器 SpringJUnit4ClassRunner.class 让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration ---注解引入配置文件
@ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml")
public class ProducerTest2 {
//1.注入RabbitTemplate
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 确认模式:
* 步骤:
* 1、确认开启:connection-factory中的publisher-confirms="true"
* 2、在rabbitTemplate定义ConfirmCallBack回调函数
*
*/
@Test
public void testConfirm(){
//2、定义回调函数
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/**
*
* @param correlationData 相关配置信息
* @param b exchange交换机是否成功收到消息 。true 成功 false 失败
* @param s 失败原因
*/
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println("confirm方法被执行了。。。");
if(b){
//接收成功
System.out.println("接收成功"+s);
}else{
//接收失败
System.out.println("接收失败"+s);
}
}
});
//3、发送消息
rabbitTemplate.convertAndSend("spring_exchange_confirm","confirm1","massage confirm...");
}
/**
* 回退模式:当消息发送给Exchange后,Exchange路由到queue失败时才会执行ReturnCallBack
* 步骤:
* 1、开启回退模式 publisher-returns="true"
* 2、设置ReturnCallBack
* 3、设置Exchange处理消息的模式
* 1、如果消息没有路由到Queue,则丢弃消息(默认)
* 2、如果消息没有路由到Queue,返回给消息发送方
*/
@Test
public void testReturn(){
//设置交换机处理失败消息的模式
rabbitTemplate.setMandatory(true);
//2.设置ReturnCallBack
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("ReturnCallback被执行了....");
System.out.println(message);
//处理
}
});
//3、发送消息
rabbitTemplate.convertAndSend("spring_exchange_confirm","confirm1","massage confirm...");
}
}