安装RabbitMQ
安装Eralng与RabbitMQ
导包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
生产者配置
关于spring.rabbitmq.template.mandatory与spring.rabbitmq.publisher-returns
- spring.rabbitmq.template.mandatory属性的优先级高于spring.rabbitmq.publisher-returns的优先级
- spring.rabbitmq.template.mandatory属性可能会返回三种值null、false、true,
- spring.rabbitmq.template.mandatory结果为true、false时会忽略掉
- spring.rabbitmq.publisher-returns属性的值
spring.rabbitmq.template.mandatory结果为null(即不配置)时结果由spring.rabbitmq.publisher-returns确定
在springboot2.2.0.RELEASE版本之前是amqp正式支持的属性,用来配置消息发送到交换器之后是否触发回调方法,在2.2.0及之后spring.rabbitmq.publisher-confirm属性过期使用spring.rabbitmq.publisher-confirm-type属性配置代替,用来配置更多的确认类型;
- NONE值是禁用发布确认模式,是默认值;
- CORRELATED值是发布消息成功到交换器后会触发回调方法;
- SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#开启 return 确认机制
#spring.rabbitmq.publisher-returns=true
#设置为true后消费者在消息没有被路由到合适队列情况下会被return监听,而不会自动删除
spring.rabbitmq.template.mandatory=true
#开启confirm确认机制
spring.rabbitmq.publisher-confirm-type=correlated
创建bind交换机与队列
package org.example.rabbit.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DirectRabbitConfig {
//队列 起名:TestDirectQueue
// @Bean
// public Queue TestDirectAQueue() {
// // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// // return new Queue("TestDirectQueue",true,true,false);
//
// //一般设置一下队列的持久化就好,其余两个就是默认false
// return new Queue("direct.A",false);
// }
//
// @Bean
// Queue queueDirectBName() {
// return new Queue("direct.B",false);
// }
//
// /**
// * Direct交换机 起名:TestDirectExchange
// * 直连交换机:Direct exchange
// * 扇形交换机:Fanout exchange
// * 主题交换机:Topic exchange
// * 首部交换机:Headers exchange
// * @return
// */
// @Bean
// DirectExchange bindingTestDirectExchange() {
// // return new DirectExchange("TestDirectExchange",true,true);
// return new DirectExchange("TestDirectExchange",true,false);
// }
//
// //绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
//
// @Bean
// Binding bindingDirectA() {
// return BindingBuilder.bind(TestDirectAQueue()).to(binding