RabbitMQ的认识和API使用
RabbitMQ的认识和API使用
一、手动连接版(生产者和消费者都需要用代码来连接RabbitMQ)
1、RabbitMQ连接模型之------直连模型
(1)引入maven依赖,直连模型介绍
(2)封装连接相关的工具类
(3)"生产者"使用工具类连接MQ并发送消息
(4)"消费者"使用工具类连接MQ并接收消息
2、RabbitMQ连接模型之------任务模型
(1)任务模型介绍
以上是平均分配消息,若两个消费者消费时间不一样,需要实现“能者多劳”,则需要关闭自动确认,当消费了某条消息后手动确认:
(2)工具类同上
(3)"生产者"使用工具类连接MQ并发送消息
(4)"消费者"使用工具类连接MQ并接收消息
1号消费者
消费结果:
2号消费者
消费结果:
3、RabbitMQ连接模型之------订阅发布的广播模型
(1)模型介绍
适用场景:不同系统需要同时订阅某消息
(2)工具类同上
(3)"生产者"使用工具类连接MQ并发送消息
(4)"消费者"使用工具类连接MQ并接收消息
1号消费者
2、3号消费者和1号消费者代码一样
4、RabbitMQ连接模型之------路由模型
(1)模型介绍
应用场景:生产者发送消息,消费者1接收队列routing key为error的消息,消费者2接收队列的routing key为iofo和error、warning的消息
(2)工具类同上
(3)"生产者"使用工具类连接MQ并发送消息
(4)"消费者"使用工具类连接MQ并接收消息
1号消费者接收"error"
2号消费者接收"info、error、warning"
4、RabbitMQ连接模型之------动态路由模型
(1)模型介绍
应用场景,可对routing key 进行通配符匹配,比如生产者发送到"user.save"的key中,消费者1消费"user.*",消费者2消费"user.#"
(2)工具类同上
(3)"生产者"使用工具类连接MQ并发送消息
(4)"消费者"使用工具类连接MQ并接收消息
1号消费者接收"user.*"(一个*代表一个任意单词)
2号消费者接收"user.#"(一个#代表0到多个任意单词,即只要包含user的都匹配得到)
二、springboot集成版
1、使用步骤
(1)AmqpAdmin的使用
- 不在操作界面,用代码来创建交换机Exchange、队列Queue、绑定Binding
1、引入mavne的amqp依赖
2、在配置文件里配置连接信息
3、启动类加上@EnableRabbit开启功能
4、创建交换机Exchange、队列Queue、绑定Binding
(2)RabbitTemplate的使用
- 用来收发消息
(3)springboot使用mq时补充说明
1、在启动类上加入@EnableRabbit注解
2、如果需要将生产者发送的消息序列化成JSON,可以新建配置类MyRabbitConfig
3、使用@RabbitListener,必须有@EnableRabbit注解
4、发送的消息不一定是字符串类型,还可以是自己的JavaBean
5、接收消息时,如果需要整个消息的全部信息,包括消息头、消息体,可以使用Message类作第一个参数接收,获取消息信息可以直接在第二个参数获取,第三个参数是获取通道信息的参数
6、@RabbitListener和@RabbitHandler的区别。
文字描述:当生产者发送了两个不同的java类型数据,这时就可以在类上使用@RabbitListener监听队列,在方法上使用@RabbitHandler处理不同实体类消息
7、消息确认机制。
①发送端(生产者)的相关确认机制
(1)开启发送端(生产者)确认。
说明:生产者发送到Broker代理后就确认,不会等到消息进入指定队列,更不会到消费者消费消息
1.在配置文件加上spring.rabbitmq.publisher-confirms=true
2.配置类MyRabbitConfig中设置确认回调函数
(2)发送端(生产者)将消息发送到指定队列时的确认回调。
说明:只有将消息发送到指定队列失败才会进入这个回调,比如发送到了某个不存在的队列中
1.在配置文件加上spring.rabbitmq.publisher-returns=true
、spring.rabbitmq.template.mandatory=true
2.配置类MyRabbitConfig中设置确认回调
②接收者(消费者)确认机制
说明:默认情况下是自动确认的,会出现收到消息但没消费完消息就被删除的情况,导致数据丢失。实现确认机制目的是,在消费者确认消费完消息时,Broker才会删除消息,保证消息都被正确消费。
(1)消费者接收并消费完消息后手动确认
1.在配置文件加上spring.rabbitmq.listener.simple.acknowledge-mode=manual
、
2.在上面的补充说明第五点中有一个通道Channel channel参数,使用channel.basicAck()
消息确认机制总结:
8、死信的相关概念
死信队列的创建代码
说明:springboot内置了一个简化操作rabbitmq的模板对象RabbitTemplate,直接注入即可使用
2、springboot直连模型使用
生产者代码
消费者代码
3、springboot任务模型使用
生产者代码(生产十条消息,消费者1、2平均消费)
消费者1、2号
运行结果:
4、springboot广播模型使用
生产者代码
消费者1、2号代码
5、springboot路由模型使用
生产者代码
消费者1、2号代码
6、springboot动态路由模型使用
生产者代码
消费者1、2号代码
RabbitMQ使用场景分析
RabbitMQ集群
一、普通集群
二、镜像集群
未完待续。。。