xxl-job_spring bean 懒加载踩坑
前言
最近项目升级了spring boot 版本到 2.3.4.release .
其中该版本新增 yaml 配置项 spring.main.lazy-initialization=[true|false] .
可以全局指定bean初始化懒加载 .
为了稍微提升一下spring boot 项目的启动速度 . 我直接将该配置设置为true
然后发现 xxl-job-admin(v2.2.0) 中 , 执行器无法执行发现项目中注册的xxl-job executor了.
排查问题
在重新构建项目结束项目进程时 , 发现xxl-job的类进行销毁动作时 , 报了一个 NPE .
跳转相应代码
明显是 embedServer 为 null 导致的 NPE , 跳转到该属性初始化操作的方法 com.xxl.job.core.executor.XxlJobExecutor#initEmbedServer .
打上断点 , 然后本地重新启动. 发现断点并没有生效. 然后逐级往上追踪调用 , 最后发现基于 spring 的初始步骤没有执行 com.xxl.job.core.executor.impl.XxlJobSpringExecutor#afterSingletonsInstantiated
找到父级接口定义
翻译一下spring 提供的接口的文档描述 , 真相大白 . 原来如果 Bean的初始化开启了懒加载 , 则不会执行该方法回调.
反手关闭了全局懒加载 .
重新启动项目 , 可以看到 xxl-job-admin 上面项目对应的执行器自动发现客户端成功了 .
总结
xxl-job 整合 spring 的执行器的注册操作 , 是通过 spring 的 org.springframework.beans.factory.SmartInitializingSingleton 提供的单例bean回调接口实现的 . 而该api方法如果对应的单例bean设置为懒加载 , 则不会触发 . 所以需要确保 xxl-job 执行器 com.xxl.job.core.executor.impl.XxlJobSpringExecutor 的bean 初始化策略不为懒加载 .