Spring Boot集成Quartz部署WebLogic首次执行任务后自动重启问题
问题根因分析
从提供的运行日志可以观测到:首次执行Quartz任务时,Spring应用的ReadinessState先切换为REFUSING_TRAFFIC(拒绝流量)状态,随后多层嵌套的AnnotationConfigServletWebServerApplicationContext依次被销毁,本质是应用上下文触发了重载流程。
结合部署环境为WebLogic、重启后所有Quartz任务均可正常运行的特征,核心触发逻辑为:Quartz默认会在首次任务执行时才完成Scheduler全量初始化,该初始化动作涉及新类加载、线程池创建等操作,被环境自带的自动重载机制判定为需要触发应用重启的条件;重启后Scheduler已完成初始化,后续无相关变更动作,因此任务运行正常。
可行解决方案
- 方案1:移除生产环境不必要的热部署依赖
如果你的应用引入了spring-boot-devtools依赖,该组件默认会检测类路径变更触发自动重启,Quartz首次初始化加载的类会被判定为类路径变动。生产环境建议直接移除该依赖,也可在application.properties/application.yml中添加配置排除Quartz相关资源的重启检测:
spring.devtools.restart.exclude=org/quartz/**,**/Quartz相关配置类全限定名
- 方案2:配置Quartz JobFactory交由Spring容器托管
默认Quartz的JobFactory会自行实例化Job对象,未纳入Spring容器生命周期管理,容易触发类加载器变动。新增自定义JobFactory适配Spring容器:
@Component public class SpringJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
在Quartz配置类中指定该JobFactory:
@Configuration public class QuartzConfig { @Bean public SchedulerFactoryBean schedulerFactoryBean(SpringJobFactory springJobFactory) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setJobFactory(springJobFactory); return factory; } }
方案3:关闭WebLogic侧的应用自动重载配置
WebLogic默认开启了应用上下文自动重载能力,会在检测到应用内类/线程变更时触发重启。可登录WebLogic控制台,进入对应应用的「配置>部署」页面,找到「重载」相关配置项,将「重载启用」设置为false,保存后重新部署应用即可。方案4:调整Quartz初始化时机为应用启动阶段
避免首次任务执行时才触发初始化动作,在SchedulerFactoryBean配置中添加启动延迟参数,让Quartz随Spring容器启动完成初始化:
// 在QuartzConfig的schedulerFactoryBean方法中添加该行配置 factory.setStartupDelay(10); // 单位为秒,可根据应用启动耗时调整
内容的提问来源于stack exchange,提问作者crazy_code
相关产品推荐
相关产品推荐

