RabbitMQ的消息投递路径为:
producer–>rabbitmq broker–>exchange–>queue–>consumer
RabbitMQ提供了两种方式用来控释消息投递的可靠性模型
(1)confirm 确认模式
(2)return 退回模式
分别为:
(1)消息从producer到exchange,会返回一个confirmCallback
(2)消息从exchange到queue投递失败则返回一个returnCallback
1.confirm 确认模式
测试:
首先通过配置文件开启消息投递确认机制,默认是不开启的。
# 配置RabbitMQ的基本信息
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
# 消息投递确认机制
publisher-confirm-type: correlated
none值是禁用发布确认模式,是默认值
correlated值是发布消息成功到交换器后会触发回调方法
simple值经测试有两种效果,其一效果和correlated值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
package cn.sysu;
import cn.sysu.config.RabbitMQComfig;
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;
@SpringBootTest
public class ProducerApplicationTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
void contextLoads() {
rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test1.hello","test-message1");
rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test2.word","test-message2");
}
@Test
void testConfirm() {
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println("消息投递后执行confirm方法");
System.out.println(correlationData);
System.out.println(b);
System.out.println(s);
}
});
rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test1.hello","test-confirm");
}
}
correlationData:相关配置信息
boolean b:是否发送成功
String s:失败原因
2.return 回退模式
回退是当exchange中的消息路由到queue失败后才执行ReturnCallback
测试
(1)设置配置文件
# 配置RabbitMQ的基本信息
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
# 消息投递确认机制
publisher-confirm-type: correlated
# 消息投递回退机制
publisher-returns: true
(2)设置ReturnCallback,并设置Exchange处理消息的模式
如果消息没有路由到queue,则丢弃消息(默认)
如果消息没有路由到queue,则返回给消息发送方ReturnCallBack,
因此需要设置,不能默认。
@Test
void testReturn() {
//设置交换机处理失败消息的模式
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("return方法执行了");
}
});
rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test3.ming","test-return");
}
博主的坚持 离不开大家评论和点赞,感谢大家支持!!!