From 2ff34d3108b7a1b78a46a8aac2f2798312c01138 Mon Sep 17 00:00:00 2001 From: huifer Date: Wed, 4 Mar 2020 09:32:41 +0800 Subject: [PATCH] add about enableJms document --- docs/Spring/message/Spring-EnableJms.md | 411 ++++++++++++++++++ .../springmessage/image-20200304085303580.png | Bin 0 -> 16724 bytes .../springmessage/image-20200304092154712.png | Bin 0 -> 27061 bytes 3 files changed, 411 insertions(+) create mode 100644 docs/Spring/message/Spring-EnableJms.md create mode 100644 images/springmessage/image-20200304085303580.png create mode 100644 images/springmessage/image-20200304092154712.png diff --git a/docs/Spring/message/Spring-EnableJms.md b/docs/Spring/message/Spring-EnableJms.md new file mode 100644 index 0000000..43e3f9a --- /dev/null +++ b/docs/Spring/message/Spring-EnableJms.md @@ -0,0 +1,411 @@ +# Spring EnableJms 注解 +- Author: [HuiFer](https://github.com/huifer) +- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read) +- 源码路径: `org.springframework.jms.annotation.EnableJms` + +## 源码分析 +```java +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import(JmsBootstrapConfiguration.class) +public @interface EnableJms { +} +``` + +- 该类的切入点在`@Import(JmsBootstrapConfiguration.class)` , 直接看`JmsBootstrapConfiguration`就可以了 + + +```java +@Configuration +@Role(BeanDefinition.ROLE_INFRASTRUCTURE) +public class JmsBootstrapConfiguration { + + /** + * jms 监听注解后处理, 将{@link JmsListener} 注册到{@link JmsListenerContainerFactory} + * @return + */ + @Bean(name = JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME) + @Role(BeanDefinition.ROLE_INFRASTRUCTURE) + public JmsListenerAnnotationBeanPostProcessor jmsListenerAnnotationProcessor() { + return new JmsListenerAnnotationBeanPostProcessor(); + } + + + /** + * JMS 监听注册 + * @return + */ + @Bean(name = JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME) + public JmsListenerEndpointRegistry defaultJmsListenerEndpointRegistry() { + return new JmsListenerEndpointRegistry(); + } + +} +``` + +### JmsListenerAnnotationBeanPostProcessor + +类图 + +![image-20200304085303580](/images/springmessage/image-20200304085303580.png) + + + +- 主要关注 + + 1. **afterSingletonsInstantiated** +2. **postProcessAfterInitialization** + +#### afterSingletonsInstantiated +```JAVA +@Override + public void afterSingletonsInstantiated() { + // Remove resolved singleton classes from cache + this.nonAnnotatedClasses.clear(); + + if (this.beanFactory instanceof ListableBeanFactory) { + // Apply JmsListenerConfigurer beans from the BeanFactory, if any + // 根据类型获取bean + Map beans = + ((ListableBeanFactory) this.beanFactory).getBeansOfType(JmsListenerConfigurer.class); + + List configurers = new ArrayList<>(beans.values()); + // 排序 Order + AnnotationAwareOrderComparator.sort(configurers); + for (JmsListenerConfigurer configurer : configurers) { + // 放入jms监听配置,开发者自定义 + configurer.configureJmsListeners(this.registrar); + } + } + + if (this.containerFactoryBeanName != null) { + this.registrar.setContainerFactoryBeanName(this.containerFactoryBeanName); + } + + if (this.registrar.getEndpointRegistry() == null) { + // Determine JmsListenerEndpointRegistry bean from the BeanFactory + if (this.endpointRegistry == null) { + Assert.state(this.beanFactory != null, "BeanFactory must be set to find endpoint registry by bean name"); + this.endpointRegistry = this.beanFactory.getBean( + JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME, JmsListenerEndpointRegistry.class); + } + this.registrar.setEndpointRegistry(this.endpointRegistry); + } + + + // Set the custom handler method factory once resolved by the configurer + MessageHandlerMethodFactory handlerMethodFactory = this.registrar.getMessageHandlerMethodFactory(); + if (handlerMethodFactory != null) { + this.messageHandlerMethodFactory.setMessageHandlerMethodFactory(handlerMethodFactory); + } + + // Actually register all listeners + this.registrar.afterPropertiesSet(); + } +``` + +- 关注最后一行`this.registrar.afterPropertiesSet()` + + ```JAVA + @Override + public void afterPropertiesSet() { + registerAllEndpoints(); + } + + protected void registerAllEndpoints() { + Assert.state(this.endpointRegistry != null, "No JmsListenerEndpointRegistry set"); + synchronized (this.mutex) { + for (JmsListenerEndpointDescriptor descriptor : this.endpointDescriptors) { + // 注册监听 + this.endpointRegistry.registerListenerContainer( + descriptor.endpoint, resolveContainerFactory(descriptor)); + } + this.startImmediately = true; // trigger immediate startup + } + } + ``` + +- 注册监听在下面分析会讲详见下文 + + + + + +#### postProcessAfterInitialization + +```JAVA + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AopInfrastructureBean || bean instanceof JmsListenerContainerFactory || + bean instanceof JmsListenerEndpointRegistry) { + // Ignore AOP infrastructure such as scoped proxies. + return bean; + } + + // 获取 bean 的代理对象.class + Class targetClass = AopProxyUtils.ultimateTargetClass(bean); + if (!this.nonAnnotatedClasses.contains(targetClass)) { + Map> annotatedMethods = MethodIntrospector.selectMethods(targetClass, + (MethodIntrospector.MetadataLookup>) method -> { + Set listenerMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations( + method, JmsListener.class, JmsListeners.class); + return (!listenerMethods.isEmpty() ? listenerMethods : null); + }); + if (annotatedMethods.isEmpty()) { + this.nonAnnotatedClasses.add(targetClass); + if (logger.isTraceEnabled()) { + logger.trace("No @JmsListener annotations found on bean type: " + targetClass); + } + } else { + // Non-empty set of methods + annotatedMethods.forEach((method, listeners) -> + listeners.forEach(listener -> processJmsListener(listener, method, bean))); + if (logger.isDebugEnabled()) { + logger.debug(annotatedMethods.size() + " @JmsListener methods processed on bean '" + beanName + + "': " + annotatedMethods); + } + } + } + return bean; + } + +``` + + + +```JAVA + protected void processJmsListener(JmsListener jmsListener, Method mostSpecificMethod, Object bean) { + Method invocableMethod = AopUtils.selectInvocableMethod(mostSpecificMethod, bean.getClass()); + + // 设置 监听方法信息 + MethodJmsListenerEndpoint endpoint = createMethodJmsListenerEndpoint(); + endpoint.setBean(bean); + endpoint.setMethod(invocableMethod); + endpoint.setMostSpecificMethod(mostSpecificMethod); + endpoint.setMessageHandlerMethodFactory(this.messageHandlerMethodFactory); + endpoint.setEmbeddedValueResolver(this.embeddedValueResolver); + endpoint.setBeanFactory(this.beanFactory); + endpoint.setId(getEndpointId(jmsListener)); + endpoint.setDestination(resolve(jmsListener.destination())); + if (StringUtils.hasText(jmsListener.selector())) { + endpoint.setSelector(resolve(jmsListener.selector())); + } + if (StringUtils.hasText(jmsListener.subscription())) { + endpoint.setSubscription(resolve(jmsListener.subscription())); + } + if (StringUtils.hasText(jmsListener.concurrency())) { + endpoint.setConcurrency(resolve(jmsListener.concurrency())); + } + + JmsListenerContainerFactory factory = null; + String containerFactoryBeanName = resolve(jmsListener.containerFactory()); + if (StringUtils.hasText(containerFactoryBeanName)) { + Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name"); + try { + factory = this.beanFactory.getBean(containerFactoryBeanName, JmsListenerContainerFactory.class); + } catch (NoSuchBeanDefinitionException ex) { + throw new BeanInitializationException("Could not register JMS listener endpoint on [" + + mostSpecificMethod + "], no " + JmsListenerContainerFactory.class.getSimpleName() + + " with id '" + containerFactoryBeanName + "' was found in the application context", ex); + } + } + + // 注册监听点 到 JmsListenerContainerFactory + this.registrar.registerEndpoint(endpoint, factory); + } + +``` + +- 将监听点注册的重要方法 **`org.springframework.jms.config.JmsListenerEndpointRegistrar#registerEndpoint(org.springframework.jms.config.JmsListenerEndpoint, org.springframework.jms.config.JmsListenerContainerFactory)`** + +```java + public void registerEndpoint(JmsListenerEndpoint endpoint, @Nullable JmsListenerContainerFactory factory) { + Assert.notNull(endpoint, "Endpoint must not be null"); + Assert.hasText(endpoint.getId(), "Endpoint id must be set"); + + // Factory may be null, we defer the resolution right before actually creating the container + // jms 监听点描述 + JmsListenerEndpointDescriptor descriptor = new JmsListenerEndpointDescriptor(endpoint, factory); + + synchronized (this.mutex) { + if (this.startImmediately) { // register and start immediately + Assert.state(this.endpointRegistry != null, "No JmsListenerEndpointRegistry set"); + // 注册 + this.endpointRegistry.registerListenerContainer(descriptor.endpoint, + resolveContainerFactory(descriptor), true); + } + else { + this.endpointDescriptors.add(descriptor); + } + } + } + +``` + + + +- `org.springframework.jms.config.JmsListenerEndpointRegistry#registerListenerContainer(org.springframework.jms.config.JmsListenerEndpoint, org.springframework.jms.config.JmsListenerContainerFactory, boolean)` + + ```java + public void registerListenerContainer(JmsListenerEndpoint endpoint, JmsListenerContainerFactory factory, + boolean startImmediately) { + + Assert.notNull(endpoint, "Endpoint must not be null"); + Assert.notNull(factory, "Factory must not be null"); + String id = endpoint.getId(); + Assert.hasText(id, "Endpoint id must be set"); + + synchronized (this.listenerContainers) { + if (this.listenerContainers.containsKey(id)) { + throw new IllegalStateException("Another endpoint is already registered with id '" + id + "'"); + } + // 创建消息监听容器 + MessageListenerContainer container = createListenerContainer(endpoint, factory); + this.listenerContainers.put(id, container); + if (startImmediately) { + // 启动消息监听容器 + startIfNecessary(container); + } + } + } + ``` + + + +- `org.springframework.jms.config.JmsListenerEndpointRegistry#createListenerContainer` + +```java + /** + * Create and start a new container using the specified factory. + * 创建监听容器 + */ + protected MessageListenerContainer createListenerContainer(JmsListenerEndpoint endpoint, + JmsListenerContainerFactory factory) { + + // 创建监听 容器 + MessageListenerContainer listenerContainer = factory.createListenerContainer(endpoint); + + if (listenerContainer instanceof InitializingBean) { + try { + // 后置方法 + ((InitializingBean) listenerContainer).afterPropertiesSet(); + } catch (Exception ex) { + throw new BeanInitializationException("Failed to initialize message listener container", ex); + } + } + + int containerPhase = listenerContainer.getPhase(); + if (containerPhase < Integer.MAX_VALUE) { // a custom phase value + if (this.phase < Integer.MAX_VALUE && this.phase != containerPhase) { + throw new IllegalStateException("Encountered phase mismatch between container factory definitions: " + + this.phase + " vs " + containerPhase); + } + this.phase = listenerContainer.getPhase(); + } + + return listenerContainer; + } + +``` + + + + + +- 关键接口`JmsListenerContainerFactory` + + ```JAVA + public interface JmsListenerContainerFactory { + + /** + * Create a {@link MessageListenerContainer} for the given {@link JmsListenerEndpoint}. + * 创建肩痛容器 + * @param endpoint the endpoint to configure + * @return the created container + */ + C createListenerContainer(JmsListenerEndpoint endpoint); + + } + ``` + + ![image-20200304092154712](/images/springmessage/image-20200304092154712.png) + + + +- 注册完成后是否立即启动 + + ```java + this.listenerContainers.put(id, container); + if (startImmediately) { + // 启动消息监听容器 + startIfNecessary(container); + } + + private void startIfNecessary(MessageListenerContainer listenerContainer) { + if (this.contextRefreshed || listenerContainer.isAutoStartup()) { + listenerContainer.start(); + } + } + + ``` + + - 具体实现: `org.springframework.jms.listener.AbstractJmsListeningContainer#start` + +- 执行完`start`方法就结束了`processJmsListener`的调用链路, `postProcessAfterInitialization` 也结束了 + + + + + + + +### JmsListenerEndpointRegistry + +- 这个类辅助**JmsListenerAnnotationBeanPostProcessor** 处理 + +#### registerListenerContainer + +```java + /** + * Create a message listener container for the given {@link JmsListenerEndpoint}. + *

This create the necessary infrastructure to honor that endpoint + * with regards to its configuration. + *

The {@code startImmediately} flag determines if the container should be + * started immediately. + *

+ * 注册监听容器 + * + * @param endpoint the endpoint to add + * 监听点 + * @param factory the listener factory to use + * 监听容器工厂 + * @param startImmediately start the container immediately if necessary + * 是否立即启动容器 + * @see #getListenerContainers() + * @see #getListenerContainer(String) + */ + public void registerListenerContainer(JmsListenerEndpoint endpoint, JmsListenerContainerFactory factory, + boolean startImmediately) { + + Assert.notNull(endpoint, "Endpoint must not be null"); + Assert.notNull(factory, "Factory must not be null"); + String id = endpoint.getId(); + Assert.hasText(id, "Endpoint id must be set"); + + synchronized (this.listenerContainers) { + if (this.listenerContainers.containsKey(id)) { + throw new IllegalStateException("Another endpoint is already registered with id '" + id + "'"); + } + // 创建消息监听容器 + MessageListenerContainer container = createListenerContainer(endpoint, factory); + this.listenerContainers.put(id, container); + if (startImmediately) { + // 启动消息监听容器 + startIfNecessary(container); + } + } + } + +``` + diff --git a/images/springmessage/image-20200304085303580.png b/images/springmessage/image-20200304085303580.png new file mode 100644 index 0000000000000000000000000000000000000000..81d0df9478aa1ea7e7f037fde726a370bba25268 GIT binary patch literal 16724 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 bQ=D>qIOy(jCh(Y`0_bWR-L2Go@a%s8PZ>a6 literal 0 HcmV?d00001 diff --git a/images/springmessage/image-20200304092154712.png b/images/springmessage/image-20200304092154712.png new file mode 100644 index 0000000000000000000000000000000000000000..1318ee614a4a94408dd8a8287e7534127610962d GIT binary patch literal 27061 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 Y99dD!Q`e`2?a66uXnu{PfBX6W08L2