目录
- ★ Spring Boot 为 RabbitMQ 提供的自动配置
- ▲ 自动配置类:RabbitAutoConfiguration
- ▲ 属性处理类:RabbitProperties
- 相关配置
- ★ AmqpAdmin的方法
- ★ AmqpTemplate的方法
- 代码演示
- 创建一个springboot的项目。
- application.properties 配置属性
★ Spring Boot 为 RabbitMQ 提供的自动配置
▲ Spring Boot 提供了一个 spring-boot-starter-amqp 的Starter来支持RabbitMQ,只要添加该Starter,它就会添加 spring-rabbit 依赖库(它有传递依赖了amqp-client.jar)
▲ 只要类加载路径下包含了 spring-rabbit 依赖库,
Spring Boot 会自动配置 CachingConnectionFactory
(CachingConnectionFactory:带缓存的连接工厂,由 RabbitConnectionFactoryCreator 负责)、
还会自动配置 AmqpAdmin 和 AmqpTemplate
(实际上就是RabbitTemplate,由RabbitTemplateConfiguration负责)。
AmqpAdmin 负责管理Exchange、队列和绑定。
AmqpTemplate 负责发送、接收消息。
▲ 自动配置类:RabbitAutoConfiguration
自动配置类:RabbitAutoConfiguration
——只有当RabbitTemplate(位于spring-rabbit.jar包中),
Channel(位于amqp-client.jar中)两个类存在时,该自动配置类才会生效。
该自动配置类配置了 RabbitMessagingTemplate,该Bean只是对RabbitTemplate的简单包装。
上面RabbitAutoConfiguration自动配置类包含如下的两个静态内部类(配置类)
静态内部类:RabbitConnectionFactoryCreator:
它的作用就是在容器中配置一个 CachingConnectionFactory ,
而 CachingConnectionFactory 对 RabbitMQ 原生的 ConnectionFactory 进行包装,增加了缓存功能。
静态内部类:RabbitTemplateConfiguration:
它的作用是在容器中配置了3个Bean:
Bean A:RabbitTemplateConfigurer,它负责对容器中RabbitTemplate进行定制。
该Bean可以被取代,开发者一旦在容器中配置了自己的RabbitTemplateConfigurer,
它就会取代该Bean。
Bean B: RabbitTemplate:它就是一个AmqpTemplate。
如果开发者配置了自己的 RabbitTemplate,自动配置的RabbitTemplate就失效。
AmqpTemplate
↑
RabbitOperations
↑
RabbitTemplate
Bean C: AmqpAdmin:如果开发者配置了自己的AmqpAdmin,自动配置的AmqpAdmin就失效。
但如果你将spring.rabbitmq.dynamic属性指定为false,那么该AmqpAdmin就不会自动配置了。
▲ 属性处理类:RabbitProperties
属性处理类:RabbitProperties:
该属性处理类除了可配置host、port、password、username等基本属性之外,
还可以配置spring.rabbitmq.ssl.*开头的属性,用于配置SSL连接相关keyStore、trustStore等相关信息。
还可以配置spring.rabbitmq.cache.*开头的属性,用于配置缓存相关信息。
还可以配置spring.rabbitmq.listener.*开头的属性,用于配置和消息监听器的容器工厂相关的属性
还可以配置spring.rabbitmq.template.*开头的属性,用于配置和RabbitTemplate相关的属性
相关配置
★ AmqpAdmin的方法
它主要就是提供了一些管理Exchange、Queue、绑定相关的方法。
- void declareExchange(Exchange exchange):声明Exchange。
- String declareQueue(Queue queue):声明队列。
- Queue declareQueue():声明由服务器命名、独占的、自动删除的、非持久化的队列。
- declareBinding(Binding binding):声明队列或Exchange与Exchange的绑定。
- boolean deleteExchange(String exchangeName):删除Exchange。
- boolean deleteQueue(String queueName):无条件地删除队列
- void deleteQueue(String queueName, boolean unused, boolean empty):
删除队列,只有当该队列不再使用、且没有消息时才删除。
- void removeBinding(Binding binding):解除绑定。
★ AmqpTemplate的方法
它主要就是提供了一些发送消息的方法。
- convertAndSend(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor):
自动将messag参数转换成消息、发送给exchange。
在发送之前,还可通过messagePostProcessor参数对消息进行修改。
- convertSendAndReceive(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor):
该方法发送消息之后会等待返回的消息。
- send(String exchange, String routingKey, Message message):发送消息。
- sendAndReceive(String exchange, String routingKey, Message message):
该方法发送消息之后会等待返回的消息
- receive(String queueName, long timeoutMillis):指定从queueName队列接收消息。
备注:一般不会通过该方法来接收消息,而是推荐使用消息监听器、以异步的方式来接收消息。
剩下的事情,就是将AmqpAdmin、AmqpTemplate注入程序组件(Service),
然后程序组件即可通过它们来操作RabbitMQ消息队列。
代码演示
创建一个springboot的项目。
application.properties 配置属性
# 配置连接 RabbitMQ 的基本信息------------------------------------------------------
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
# 下面属性可配置多个以逗号隔开的连接地址,一旦配置了该属性,host 和 port 属性就会被忽略
# spring.rabbitmq.addresses=
spring.rabbitmq.username=ljh
spring.rabbitmq.password=123456
# 连接虚拟主机
spring.rabbitmq.virtual-host=my-vhost01
# 配置RabbitMQ的缓存相关信息--------------------------------------------------------
# 指定缓存 connection ,还是缓存 channel
spring.rabbitmq.cache.connection.mode=channel
# 指定可以缓存多少个 Channel
spring.rabbitmq.cache.channel.size=50
# 如果选择的缓存模式是 connection , 那么就可以配置如下属性
# spring.rabbitmq.cache.connection.size=15
# 配置 和 RabbitTemplate 相关的属性--------------------------------------------------
# 指定 RabbitTemplate 发送消息失败时会重新尝试
spring.rabbitmq.template.retry.enabled=true
# RabbitTemplate 发送消息失败后每隔1秒重新尝试发送消息
spring.rabbitmq.template.retry.initial-interval=1s
# RabbitTemplate 发送消息失败时,最多尝试重新发送消息的次数
spring.rabbitmq.template.retry.max-attempts=5
# 设置每次尝试重新发送消息的时间间隔是一个等比数列:1s, 2s, 4s, 8s, 16s
# 第一次等1s后尝试,第二次等2s后尝试,第三次等4s后尝试重新发送消息......
spring.rabbitmq.template.retry.multiplier=2
# 指定发送消息时默认的Exchange名
spring.rabbitmq.template.exchange=""
# 指定发送消息时默认的路由key
spring.rabbitmq.template.routing-key="test"
# 配置和消息监听器的容器工厂相关的属性--------------------------------------------------
# 指定监听器容器工厂的类型
spring.rabbitmq.listener.type=simple
# 指定消息的确认模式
spring.rabbitmq.listener.simple.acknowledge-mode=auto