RabbitMQ+SpringBoot的基础使用
2025-03-02 20:26:39 0 举报
AI智能生成
RabbitMQ+SpringBoot的基础使用,包括交换机的配置,生产者和消费者的实现,如何配置消息监听器,以及一些主要的配置项
作者其他创作
大纲/内容
交换机
DirectExchange
路由模式,同一交换机下的消费者,只会接收指定路由key的消息,完全匹配key
定义队列
new Queue(name, durable, exclusive, autoDelete, args)
new Queue(name, durable, exclusive, autoDelete, args)
队列名称
是否持久化
是否独占,true只能这个connection使用
是否自动删除队列
params参数
可以配置死信队列
配置仲裁队列,用于处理毒数据,但效率会降低,默认是经典队列
params.put("x-queue-type", "quorum");
不适用于单节点、临时队列、实时要求高、安全要求低、消息积压少的场景
params.put("x-queue-type", "quorum");
不适用于单节点、临时队列、实时要求高、安全要求低、消息积压少的场景
配置流式队列,不支持死信队列,适用于数据量大,积压多的场景,例如IoT、秒杀等,有点类似kafka了
需要声明死信队列、死信交换机,并完成两者的绑定
定义交换机
new DirectExchange(交换机名称)
new DirectExchange(交换机名称)
绑定交换机和队列,routingKey为一个固定值
BindingBuilder.bind(队列Bean()).to(交换机bean()).with(routingKey)
BindingBuilder.bind(队列Bean()).to(交换机bean()).with(routingKey)
FanoutExchange
扇形(广播或订阅)模式,所有同一交换机下的消费者都会接收到消息
可以定义多个queueBean,然后绑定到同一个交换机Bean
HeadersExchange
多规则匹配模式,同一交换机下的消费者,只会接收路由键符合正则规范的消息,性能差,通常不用
Map全匹配
Map任一匹配即可
TopicExchange
按规则转发,同一交换机下的消费者,只会接收路由键符合正则规范的消息,模糊匹配key
通过 . 来分隔,形成多个部分,类似split
其中,* 表示匹配一个部分,# 表示匹配0个或多个部分
绑定队列和交换机,routingKey可以通过.*#实现模糊匹配
BindingBuilder.bind(topicQ()).to(setTopicExchange()).with(routingKey);
BindingBuilder.bind(topicQ()).to(setTopicExchange()).with(routingKey);
生产者
rabbitTemplate.convertAndSend
自动将java对象转换为RabbitMQ的消息格式(自动序列化)
exchange:交换机名称。
routingKey:路由键。
object:要发送的消息对象
routingKey:路由键。
object:要发送的消息对象
rabbitTemplate.send
直接发送一个 Message 对象,需要手动创建Message对象
exchange:交换机名称
routingKey:路由键
message:要发送的消息对象(Message 类型)
correlationData:消息生产者的唯一标识(业务上的唯一)
routingKey:路由键
message:要发送的消息对象(Message 类型)
correlationData:消息生产者的唯一标识(业务上的唯一)
事务配置
rabbitMQ的事务,仅适用于生产者,仅在投递数据的过程中适用,也就是说是在调用了rabbitMQ的send方法后,在rabbitMQ的内部启用事务
消息确认机制
# 交换机确认模式,启用后,对应confirmCallback方法能被触发
spring.rabbitmq.publisher-confirm-type=correlated
spring.rabbitmq.publisher-confirm-type=correlated
# 消息发送到队列后,若队列无法识别此消息的路由key,则返回,true则能实现returnsCallback的响应
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.publisher-returns=true
需要@Configuration注解类,实现RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback接口
消费者
@RabbitListener(queues = 队列名称)
在任意spring管理的bean中,对指定方法加上这个注解就能实现对队列的消费
Channel: 消费消息的通道
Message: 消息对象
String: 消息内容
Message: 消息对象
String: 消息内容
可以通过DeliveryTag(rabbitMQ的消息唯一标识),拒绝消费channel.basicNack(message.getMessageProperties().getDeliveryTag(), multiple, requeue);
multiple
true,拒绝所有小于等于 deliveryTag 的未确认消息。
false,仅拒绝 deliveryTag 指定的单条消息。
true,拒绝所有小于等于 deliveryTag 的未确认消息。
false,仅拒绝 deliveryTag 指定的单条消息。
requeue
true,被拒绝的消息会被重新放入队列,等待重新投递给消费者(被投递的可能是同一个消费者或其他消费者)。
false,被拒绝的消息会被丢弃,或者根据队列的配置进入死信队列。
true,被拒绝的消息会被重新放入队列,等待重新投递给消费者(被投递的可能是同一个消费者或其他消费者)。
false,被拒绝的消息会被丢弃,或者根据队列的配置进入死信队列。
仅拒绝这一条消息
basicReject(DeliveryTag, requeue)
basicReject(DeliveryTag, requeue)
用于重新发送未确认的消息,确保消息的可靠性
basicRecover()
basicRecover()
主要配置
spring.rabbitmq.listener
simple
支持动态调整消费者数量
性能较低,适合中小规模消息消费
direct
消费者数量固定
性能较高,适合高吞吐量场景

收藏
0 条评论
下一页