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