Spring-EnableJms
Spring EnableJms 注解
- Author: HuiFer
- 源码阅读仓库: SourceHot-spring
- 源码路径:
org.springframework.jms.annotation.EnableJms
源码分析
|
|
- 该类的切入点在
@Import(JmsBootstrapConfiguration.class)
, 直接看JmsBootstrapConfiguration
就可以了
|
|
JmsListenerAnnotationBeanPostProcessor
类图
-
主要关注
- afterSingletonsInstantiated
- postProcessAfterInitialization
afterSingletonsInstantiated
|
|
-
关注最后一行
this.registrar.afterPropertiesSet()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@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
|
|
|
|
- 将监听点注册的重要方法
org.springframework.jms.config.JmsListenerEndpointRegistrar#registerEndpoint(org.springframework.jms.config.JmsListenerEndpoint, org.springframework.jms.config.JmsListenerContainerFactory<?>)
|
|
-
org.springframework.jms.config.JmsListenerEndpointRegistry#registerListenerContainer(org.springframework.jms.config.JmsListenerEndpoint, org.springframework.jms.config.JmsListenerContainerFactory<?>, boolean)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
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
|
|
-
关键接口
JmsListenerContainerFactory<C extends MessageListenerContainer>
1 2 3 4 5 6 7 8 9 10 11
public interface JmsListenerContainerFactory<C extends MessageListenerContainer> { /** * Create a {@link MessageListenerContainer} for the given {@link JmsListenerEndpoint}. * 创建肩痛容器 * @param endpoint the endpoint to configure * @return the created container */ C createListenerContainer(JmsListenerEndpoint endpoint); }
-
注册完成后是否立即启动
1 2 3 4 5 6 7 8 9 10 11
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
|
|
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/code/docs/Spring/message/Spring-EnableJms/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com