rabbitmq
1.RabbitTemplate中convertSendAndReceive方法与convertAndSend方法的区别
1.1 convertSendAndReceive(…):可以同步消费者。使用此方法,当确认了所有的消费者都接收成功之后,才触发另一个convertSendAndReceive(…),也就是才会接收下一条消息。RPC调用方式。
convertAndSend(…):使用此方法,交换机会马上把所有的信息都交给所有的消费者,消费者再自行处理,不会因为消费者处理慢而阻塞线程。
消费者接受消息流程
1、生产者连接到 Rabbit Mq Broker, 建立连接(Connection), 开启信道;
2、消费者象 RabbitMq Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,和准备工作;
3、等待 RabbitMq Broker 回应并投递相应队列中的消息,消费者接受消息;
4、消费者确认 ACK(默认是自动ack,可改为手动) 接受到的消息
5、RabbitMQ 从队列中删除以及确认的额消息
6、关闭信道,关闭连接
2.参考链接
2.1 SpringBoot整合RabbitMQ实现消息的发送与接收
2.2SpringBoot2.x整合RabbitMQ(完整版)
3. rabbitmq 工作队列模式(work模式)
4. 队列模式
4.1 简单队列模式,一个生产者,一个消费者
4.2 一个生产者,多个消费者
4.3 二者之间的区别
简单队列和work 模式的不同:
简单队列只要消息从队列中获取,无论消费者获取到消息后是否成功消费,比如遇到状况:断电,都认为是消息已经成功消费;
work模式消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者反馈,如果消费这一直没有反馈,则该消息一直处于不可用状态
5.生产者消息确认,确认的两个点:确认消息已经发送到交换机;确认消息已经发送到队列
5.2 yml 中开启的配置
#配置rabbitMq 服务器 rabbitmq: host: 82.156.175.242 port: 5672 username: admin password: admin #虚拟host virtual-host: my_vhost # 确认消息已发送到交换机(Exchange) 开启Rabbitmq发送消息确认机制,发送消息到队列并触发回调方法 #publisher-confirm-type: correlated #这是新版配置 publisher-confirms: true # 确认消息已经发送到队列 publisher-returns: true

package ins.business.common.rabbitmq; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * @program: mesadminserver * @description mq发送确认 * @author: zhaoJs * @create: 2022-03-14 17:12 */ @Component @Configuration @Slf4j public class RabbitConfirm implements RabbitTemplate.ConfirmCallback , RabbitTemplate.ReturnCallback { @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void init() { //指定 ConfirmCallback rabbitTemplate.setConfirmCallback(this); rabbitTemplate.setReturnCallback(this); } @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { //log.info("(start)生产者消息确认========================="); //log.info("correlationData:[{相关数据}]", correlationData); //log.info("ack:[{确认情况}]", ack); if (!ack) { log.info("消息未送达到交换机(Exchange)"); log.info("cause:[{原因}]:"+cause); log.info("correlationData:[{相关数据}]:"+correlationData); } // log.info("(end)生产者消息确认========================="); } /** * 回调 * @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.info("消息主体:,{}", message); log.info("应答码:,{}", replyCode); log.info("描述:,{}", replyText); log.info("消息使用的交换器 exchange :,{}", exchange); log.info("消息使用的路由键 routing :,{}", routingKey); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升