xxl-job_spring bean懒加载踩坑

892 阅读1分钟

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 .

image-20220916154127412

跳转相应代码

image-20220916154242936

明显是 embedServernull 导致的 NPE , 跳转到该属性初始化操作的方法 com.xxl.job.core.executor.XxlJobExecutor#initEmbedServer .

image-20220916154519918

打上断点 , 然后本地重新启动. 发现断点并没有生效. 然后逐级往上追踪调用 , 最后发现基于 spring 的初始步骤没有执行 com.xxl.job.core.executor.impl.XxlJobSpringExecutor#afterSingletonsInstantiated

image-20220916154941687

找到父级接口定义

image-20220916155102378

翻译一下spring 提供的接口的文档描述 , 真相大白 . 原来如果 Bean的初始化开启了懒加载 , 则不会执行该方法回调.

反手关闭了全局懒加载 .

重新启动项目 , 可以看到 xxl-job-admin 上面项目对应的执行器自动发现客户端成功了 .

image-20220916155351769

总结

xxl-job 整合 spring 的执行器的注册操作 , 是通过 spring 的 org.springframework.beans.factory.SmartInitializingSingleton 提供的单例bean回调接口实现的 . 而该api方法如果对应的单例bean设置为懒加载 , 则不会触发 . 所以需要确保 xxl-job 执行器 com.xxl.job.core.executor.impl.XxlJobSpringExecutor 的bean 初始化策略不为懒加载 .