Springboot下的RabbitMQ消息监听源码解读
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot下的RabbitMQ消息监听源码解读相关的知识,希望对你有一定的参考价值。
参考技术A 以上配置比较简单,都是一些基本的配置,配置Rabbit的连接工厂,配置Template,客户端操作的模版RabbitTemplate对象。注解核心配置
主要注册一个BeanPostProcessor和RabbitListenerEndpointRegistry创建消息监听容器管理生命周期。
RabbitBootstrapConfiguration.java
在上一步将所有的方法(方法上有@RabbitListener注解的)解析处理后,接下来开始处理消息监听
接着上面构建完MethodRabbitListenerEndpoint对象后,将所有的监听方法保存
到此消息监听@RabbitListener注解的方法就处理完成了,所有的监听方法都保存到了RabbitListenerAnnotationBeanPostProcessor.registrar.endpointDescriptors集合中。
RabbitListenerAnnotationBeanPostProcessor 处理器程序实现了SmartInitializingSingleton接口,所以在所有的Bean创建完成以后会执行Bean实现了SmartInitializingSingleton#afterSingletonsInstantiated的方法。
注册监听程序
注册监听容器
监听容器工厂父类创建监听容器
到此消息监听容器MessageListenerContainer(SimpleMessageListenerContainer)对象创建完成,
到这里主要的消息监听容器都创建完成后接下来就是启动消息监听容器了。
在2.2中注册了RabbitListenerEndpointRegistry 对象,该类实现了SmartLifecycle接口,也实现了ApplicationListener接口,并且处理的是ContextRefreshedEvent事件。
上面这两个动作都会在容器上下文初始化完成以后触发,在AbstractApplicationContext#refresh#finishRefresh方法中触发
开始消息监听
异步消息处理消费者AsyncMessageProcessingConsumer
事件处理
RabbitAutoConfiguration ===》RabbitAnnotationDrivenConfiguration ===》EnableRabbitConfiguration ===》 @EnableRabbit
注册RabbitListenerAnnotationBeanPostProcessor处理器处理@RabbitListener和@RabbitHandler注解
RabbitListenerAnnotationBeanPostProcessor类
将上一步解析出来的所有方法及对应的@RabbitListener注解中配置的信息进行包装到MethodRabbitListenerEndpoint中
说明:@RabbitListener注解中的errorHandler属性可以是SpEL表达式也可以是一个Bean的名称
该步骤中主要就是设置相关的一些属性信息到Endpoint中,比如:ackMode,queueName,concurrency等信息。
构造完Endpoint对象后将其保存到RabbitListenerEndpointRegistrar中。
RabbitListenerAnnotationBeanPostProcessor类实现了SmartInitializingSingleton接口,当所有的Bean初始化完成以后会执行实现了SmartInitializingSingleton接口Bean的回调方法afterSingletonsInstantiated。
在afterSingletonsInstantiated方法中调用RabbitListenerAnnotationBeanPostProcessor.registrar(RabbitListenerEndpointRegistrar)#afterPropertiesSet
方法。
在afterPropertiesSet方法中就是注册Endpoint了,在该方法中将所有的Endpoint再封装成MessageListenerContainer(SimpleMessageListenerContainer)
对象,最后将MessageListenerContainer对象保存到RabbitListenerEndpointRegistry.listenerContainers的Map集合中。
在这里是还没有启动所有的监听程序。
RabbitListenerEndpointRegistry对象Bean实现了SmartLifecycle接口,所以容器上下文执行完(刷新完)以后会调用实现了该接口的会滴方法start,启动消息监听。
SpringBoot多数据源配置详解
SpringBoot邮件发送示例
Springboot面试题整理附答案
SpringBoot配置文件你了解多少?
SpringBoot项目查看线上日志
springboot mybatis jpa 实现读写分离
Springboot整合openfeign使用详解
SpringBoot RabbitMQ消息可靠发送与接收
Springboot整合MyBatis复杂查询应用
Springboot整合RabbitMQ死信队列详解
以上是关于Springboot下的RabbitMQ消息监听源码解读的主要内容,如果未能解决你的问题,请参考以下文章
Springboot使用RabbitMQ 发送消息,监听接收消息