SpringBoot消息源码解析:JMS基础自动配置

SpringBoot消息源码解析Spring框架对消息系统的整合提供了广泛的支持:从简单使用 Jms Template 的 JMS API,到可接收异步消息的完整基础结构 。 Spring AMQP 为“高级消息队列协议”提供了类似的功能集 。
同时 , Spring Boot 也为 RabbitTemplate 和 Rabbit MQ 提供了自动配置选项 。 Spring Boot通过自动配置对 ActiveMQ、RabbitMQ 和 Apache Kafka 提供了支持 。 本章重点讲解 SpringBoot 对 JMS 和 ActiveMQ 的自动配置操作 。
JMS 基础自动配置JMS 的全称是 Java Message Service,即 Java 消息服务 。 它主要用于在生产者和消费者之间进行消息传递 。 JMS 只是一个标准 ,在使用的时候需要有具体实现 , 比如后面要讲到的ActiveMQ 。
在 Spring Boot 中 , 通过 JmsAutoConfiguration 自动配置来完成 JMS 的基础组件的初始化 。
像其他自动配置-样 , 在 ME TA-INF/spring.factories 中可以找到注册的 JMS 自动配置类 。
# Auto Configureorg. springframework . boot . autoconfigure . jms . JmsAutoConfiguration
SpringBoot消息源码解析:JMS基础自动配置文章插图
JmsAutoConfiguration 的注解
我们先从 JmsAutoConfiguration 的注解部分看起 。
【SpringBoot消息源码解析:JMS基础自动配置】@Configuration(proxyBeanMethods = false)@Conditional0nClass({ Message . class, JmsTemplate.class })@ConditionalOnBean(ConnectionFactory . class)@EnableConfigurationProperties (JmsProperties .class)@Import (JmsAnnotat ionDrivenConfiguration. class)public class JmsAutoConfiguration {}@ConditionalOnClass 注解指定需要满足在 classpath 下存在javax.jms.Message 类和 org.springframework.jms.core.Jms Template 类的条件才会进行初始化 。
@ConditionalOnBean 注解指定需要在容器中存在javax.jms.ConnectionFactory 的 Bean 对象时才会被实例化 。
ConnectionFactory 接口提供了用于创建与 JMS 代理进行交互的 javax.jms.Connection 的标准方法 。 Spring 需要 ConnectionFactory 来 与 JMS 一起使用 , 但是通常不需要编程人员直接使用它 。
那么 , ConnectionFactory 的 Bean 是在什么时候被初始化的呢?以 ActiveMQ 为例 , Active-MQ 的自动配置会在 JmsAutoConfiguration 配置之前执行 , 并在其内部创建Connection-Factory 实现类的 Bean 对象 。其他消息框架也与此类似 , 至于是如何初始化的 , 后面关于 ActiveMQ 的自动配置的部分我们会进行详解 。
@EnableConfigurationProperties引入了JMS的配置属性类, 对应的就 是 在application.properties 文件中配置的以“spring.jms”为前缀的属性 。
@Import 引入了 JmsAnnotationDrivenConfiguration 配置 , 该配置类主要用于 Spring4.1 注解驱动的 JMS 的自动配置 。
下面我们先看 JmsAnnotationDrivenConfiguration 的注解部分和构造方法的源代码 。
@Configuration(proxyBeanMethods = false)@ConditionalOnClass (EnableJms .class)class JmsAnnotationDrivenConfiguration {private final objectProvider destinat ionResolver;private final objectProvider transactionManager Jprivate final objectProvider messageConverter;private final JmsProperties properties;JmsAnnotationDrivenConfiguration(ObjectProvider destination-Resolver,ObjectProvider transactionManager, 0bject-Provider messageConverter,JmsProperties properties) {this . destinationResolver = destinationResolver;this. transactionManager = transactionManager;this . messageConverter = messageConverter;this. properties = properties;}}@Configuration 声 明 该 类 也 是 配 置 类,@ConditionalOnClass 表 示 类 路 径 下 需 存 在EnableJms 类 。 其中 EnableJms 为一个注解类 , @EnableJms 用于开启 JMS 注解 , 使@JmsListener 注解生效 。
在之前章节已经讲过 JmsAnnotationDrivenConfiguration 的构造方法中 ObjectProvider 的作用 , 这里看其泛型部分类 。 其中 JmsProperties 参数为 JMS 的配置 , 前面已经提到过 , 下 面我们重点看其他 3 个参数 。
DestinationResolver 用于解决 JMS 目标的策略接口 , 被 Jms Template 用于将目标名称从简单的字符串解析为实际的 Destination 实现实例 。 JmsTemplate 实例使用的默认Destina-tionResolver 实现 DynamicDestinationResolver 类 。
该接口只有一个方法 ,通过源代码可以更清晰地看出它的功能 。
@FunctionalInterfacepublic interface Dest inationResolver//将给定的目标名称解析为定位资源或作为动态的 Destinat ion(返回 topic 或 queue)// Session: 为当前 JMS 的 Session// destinat ionName:目标名称// pubSubDomain: true 表示 pub-sub 模式 , false 表示 P2P 模式Destination resolveDestinationName (@Nullable Session session, String destina-tionName, boolean pubSubDomain) throwsJMSException;}