MQ
消息应答机制:消费者在接收到消息并且处理该消息之后,告诉rabbitmq他已经处理了,rabbitmq可以把该消息删除了。
自动应答:生产者消息发出,就认为发送消息成功。消费者如果消费失败,这条数据就丢失了。--适合高吞吐量但数据安全性不高的。
手动应答:消费者确认消费了,才将这条信息进行删除
交换机类型:直接(direct) 主题(topic) 标题(headers) 扇出(fanout)
fanout:直接将队列和交换机进行绑定,不需要路由key的存在,类似广播的形式。
direct:通过路由key进行绑定,但是路由key不支持通配
topic:通过路由key进行绑定,路由key支持通配,*代表一个单词,#代表零个或者多个单词。
生产者:
@Configuration public class config { public static final String EXCHANGE_NAME = "boot_topic_exchange"; public static final String QUEUE_NAME = "boot_queue"; //1.交换机 @Bean public Exchange bootExchange(){ return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build(); } //2.Queue 队列 @Bean public Queue bootQueue(){ return QueueBuilder.durable(QUEUE_NAME).build(); } //3.队列和交换机的绑定 @Bean public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue, @Qualifier("bootExchange") Exchange exchange){ return BindingBuilder.bind(queue).to(exchange).with("ideal.#").noargs(); } }
spring.application.name=springboot-rabbitmq spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/ spring.rabbitmq.listener.direct.acknowledge-mode=manual
@SpringBootTest @RunWith(SpringRunner.class) public class Test1 { @Autowired private RabbitTemplate rabbitTemplate; @Test public void testSend(){ for (int i = 0; i < 30 ; i++) { rabbitTemplate.convertAndSend(config.EXCHANGE_NAME,"hhhhhhhh"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }
消费者:
@Component public class RabbitMQListener { @RabbitListener(queues = "boot_queue") public void ListenerQueue(Message message){ System.out.println("开始打印接收"); System.out.println(new String(message.getBody())); } }
spring.application.name=springboot-rabbitmq spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/ spring.rabbitmq.listener.direct.acknowledge-mode=manual
RabbitListener会自动创建连接,队列、交换机等等。
================================================================================
高级特性
1.消息的可靠投递
在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式。
》confirm确认模式
》return退回模式
rabbitmq整个消息投递的路径为:producer---->rabbitmq broker----->exchange------->queue------->consumer
消息从producer到exchange则会返回一个confirmCallback。
消息从exchange---->queue投递失败则会返回一个returnCallback。
我们将利用这两个callback控制消息的可靠性投递
确认模式的开启
》1.配置文件中声明publisher-confirm-type:correlated开启确认模式
》2.定义回调:rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback())匿名内部类重写confirm方法
回退模式的开启
》1.配置文件中声明publisher-returns="true"开启回退模式
》2.定义回调:rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback())匿名内部类重写returnedMessage方法,模式是直接丢弃消息,方法不会被调用。使用rabbitTimplate.setMandatory(true)设置开启交换机处理失败消息的模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix