移步 查看
SpringBoot整合RabbitMQ direct交换机、fanout交换机、topic交换机
回调函数
接下来,来看一下回调函数以及针对不同的队列使用不同的逻辑进行数据的消费。
若想要进行函数的回调,那么就需要在application.properties文件中,加入这两句代码
###配置回调函数确认
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.publisher-confirm-type=correlated
然后在生产者项目中配置一下RabbitConfig
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
//设置强制调用回调函数
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
System.out.println("相关数据:"+correlationData);
System.out.println("确认情况:"+b);
System.out.println("原因:"+s);
System.out.println("===============================");
});
rabbitTemplate.setReturnsCallback(returnedMessage -> {
System.out.println("交换机为:"+returnedMessage.getExchange());
System.out.println("返回消息为:"+returnedMessage.getMessage());
System.out.println("路由键为:"+returnedMessage.getRoutingKey());
System.out.println("回应消息为:"+returnedMessage.getReplyText());
System.out.println("回应代码为:"+returnedMessage.getReplyCode());
System.out.println("===============================");
});
return rabbitTemplate;
}
}
那么发送数据时,什么时候会进入不同的回调函数呢?
上面已经介绍了四种状态,点击链接直接抵达~
然后添加以下三个方法,匹配了1、2、3中状态。
@RequestMapping("/noExchange")
public void sendToNoExchange(){
//交换机不存在
Map<String,Object> m = commonMap("Judge the exchange is not exist!");
rabbitTemplate.convertAndSend("amq.topic1","topic.asdasd",m);
}
@RequestMapping("/noRoute")
public void sendToNoRoute(){<