2022-06-17
spring task scheduler踩坑WebSocket
spring 评论:0 浏览:62

转载请注明出处:https://oldnoop.tech/c/214.html

TaskScheduler 的bean名称是taskScheduler
 
WebSocketConfigurationSupport注册了一个 bean名称为defaultSockJsTaskScheduler的 TaskScheduler
导致DefaultListableBeanFactory 的getBeanNamesForType方法获取到 TaskScheduler类型的bean 名称有多个
导致ScheduledAnnotationBeanPostProcessor的finishRegistration 获取不到 定义的TaskScheduler(名称不是taskScheduler)
最终导致使用jdk自带的单线程调度线程池
 
所以,
1)
注册一个且只有一个TaskScheduler的bean ,
在配置WebSocketConfigure时, 调用withSockJs() ,并设置 TaskScheduler
这就是 避免 WebSocketConfigure 创建TaskScheduler, 整个spring容器只有一个TaskSchudler的bean
2)
有多个类型是TaskScheduler的bean,包括WebSocketConfigure 创建的TaskScheduler的bean (可能为null)
2.1)
注册一个TaskScheduler的bean,使用注解@Primary, ( 不能有 多个@Primary注解的TaskScheduler的bean)
注册一个TaskScheduler的bean,使用注解@Priority,
这两个,都是 让 getBeanNamesForType 方法 能获取唯一的一个TaskScheduler类型的bean
2.2)
注册一个TaskScheduler的bean,指定名称是 taskScheduler
 
 
DefaultListableBeanFactory的getBeanNamesForType方法,
根据bean类型获取beanName,即 使beanName对应的bean为null也会放在 结果中 返回
DefaultListableBeanFactory的getBeansOfType方法,
beanName对应的bean为null,不会放到结果中 返回
 
 
@EnableWebSocket注解
 
DelegatingWebSocketConfiguration 配置类继承了WebSocketConfigurationSupport
registerWebSocketHandlers方法 调用 WebSocketConfigure 注册了WebSocketHandler
 
 
 
 
WebSocketConfigurationSupport 的方法
initHandlerRegistry 初始化了ServletWebSocketHandlerRegistry
defaultSockJsTaskScheduler 方法注册了一个TaskScheduler的bean, 这个bean 可能是null, 可能不是null
取决于WebSockerConfigure 配置类中 是否 调用了withSockJs() 且没有设置taskScheduler
 
 
ServletWebSocketHandlerRegistry
的addHandler方法, 初始化ServletWebSocketHandlerRegistration对象,
如果这个对象调用了withSockJs,就会设置sockJsServiceRegistration,否则 sockJsServiceRegistration为null
而且没有 设置 TaskScheduler的情况下,
 
 
requiresTaskScheduler方法 根据 是否有sockJsServiceRegistration 切没有设置TaskScheduler为条件 判断,是否需要创建一个TaskScheduler
 
 
 
ScheduledAnnotationBeanPostProcessor 通过 ApplicationEvent事件
注册 TaskScheduler,
调用resolveSchedulerBean 方法先 通过类型TaskScheduler 查找, 找到多余2个 bean, 抛出异常NoUniqueBeanDefinitionException
然后再次调用resolveSchedulerBean方法 通过名称taskScheduler查找,找不到,抛出异常NoSuchBeanDefinitionException
 
 
 
 



  • 转载请注明出处:https://oldnoop.tech/c/214.html

Copyright © 2018 oldnoop.tech. All Rights Reserved

鄂ICP备2023022735号-1