标签:template 路由 row http this 执行 exception log slf4j
完成 SpringBoot 整合 RabbitMq 中的Topic通配符模式
spring:
rabbitmq:
host: localhost
port: 5672
virtual-host: /
username: username
password: password
publisher-returns: true #开启回退模式
server:
port: 8080
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Scope;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RabbitMqTest {
private RabbitTemplate rabbitTemplate;
@Resource
@Scope("prototype")
public void setRabbitTemplate(RabbitTemplate rabbitTemplate) {
/*
SpringBoot 默认为true 如果为false下面不执行
rabbitTemplate.setMandatory(true);
注意:Spring项目必须书写!
*/
/**
* 路由没有到达Queue就会执行
*/
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
/**
*
* @param message 消息对象
* @param replyCode 消息编码
* @param replyText 时报错误信息
* @param exchange 交换机
* @param routingKey 路由键
*/
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.debug("消息没有到达Queue,该消息为:{}",message.getBody());
log.debug("错误编码:{},错误信息:{}",replyCode,replyText);
log.debug("交换机:{},路由键:{}",exchange,routingKey);
//这里routing填写正确的
rabbitTemplate.send("topic_exchange","item.aa",message);
}
});
this.rabbitTemplate = rabbitTemplate;
}
@Test
public void test() throws InterruptedException {
String body = "回退模式发送消息";
//为了达到回退模式 ,routingKey 填写一个错误的 会调用 ReturnCallback 发送一个正确的
rabbitTemplate.convertAndSend("topic_exchange","dsafasf56.chu",body);
Thread.sleep(2000);
}
}
首先运行 ProducerTest.java 单元测试,然后在启动 ConsumerListener.java 消息监听器
- 如果已经存在 topic_queue 请先删除后再执行单元测试
第一次发送的消息不会到达queue,会调用到 ReturnCallback 方法,会再次进行发送.保证消息的可靠性,不会丢失.
RabbitMq消息可靠性之回退模式 通俗易懂 超详细 【内含案例】
标签:template 路由 row http this 执行 exception log slf4j
原文地址:https://www.cnblogs.com/beixuan/p/13377641.html