@RefreshScope 加在 Quartz 触发器类导致异常问题分析

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@RefreshScope 加在 Quartz 触发器类导致异常问题分析相关的知识,希望对你有一定的参考价值。

背景

承接上篇,测试过程中又遇到了 Nacos Config 的动态刷新注解 @RefreshScope 与 Quartz 框架结合的问题,Bug 排查路上,顺手记录一下吧。

问题

有个模块使用了Quartz ,通过配置控制任务调度的周期和分组名称。

因为引用了动态配置,所以对每个注入类都加上了 @RefreshScope ,代码如下:

@Value("$quartz.task.cron")
private String taskCron;

@Bean
public JobDetail taskJobDetail()
    JobDetail jobDetail = JobBuilder.newJob(XXTaskJob.class)
            .withIdentity("taskName","taskGroup")
            .storeDurably()
            .build();
    return jobDetail;


@Bean
@RefreshScope
public Trigger taskTrigger() 
    Trigger trigger = TriggerBuilder.newTrigger()
            .forJob(taskJobDetail())
            .withIdentity("taskName","taskGroup")
            .startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule(taskCron))
            .build();
    return trigger;

启动应用报错:

自动注入 Quartz 的 Scheduler 对象异常了,因为有了上次 RestTemplate 失效的经验,所以一猜就是这个注解的问题,去掉后果然正常了。

话说回来,到底 Quartz 注入的类到底能不能动态根据配置变动呢?如果真的要支持定时任务周期和分组名称动态变动,应该怎么改造呢?

启示录

今天看到两个关于编程的观点。

言论一:《现代编程工作的实质》

我真正担心的是,今天的很多编程没有任何乐趣,它只是集合别人的软件,把组件拼起来并启动,不需要太多的创造力。
我担心编程会变得太无聊,因为你没有机会做任何新鲜事。你的兴奋来自于看到机器产生出来的有趣结果,而不是来自创造新事物的过程。现在的乐趣变成,当你完成无聊的工作后,会突然得到一个很棒的结果,但在以前,工作本身并不乏味。

另一句来自 Redis 的作者:

大多数编程不再是艺术,也不再是高级工程。大多数程序都是微不足道的:编码人员只需要理解某些特定的接口,然后编写一些逻辑和胶水代码。
– Antirez,Redis 的作者

工具人的悲哀!我还以为只有我有类似的感觉呢,SpringBoot 这么强大,开源工具这么丰富,任意一个第三方 jar 的引入,背后都是一个大黑盒,不经过透彻的测试,根本不知道有什么问题。

测试,测试,再测试!

以上是关于@RefreshScope 加在 Quartz 触发器类导致异常问题分析的主要内容,如果未能解决你的问题,请参考以下文章

@RefreshScope 和 @ConditionalOnProperty 不起作用

SpringCloud @RefreshScope实现原理

@RefreshScope 似乎忽略了 Mockito 的嘲笑

配置类中的@RefreshScope

Spring Cloud @RefreshScope 原理分析:代理类调用流程

Spring Cloud @RefreshScope 原理分析:扫描 Bean 定义