@RefreshScope在Quartz 触发器类导致异常问题解决分析
毕小宝 人气:0背景
承接上篇,测试过程中又遇到了 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 的引入,背后都是一个大黑盒,不经过透彻的测试,根本不知道有什么问题。
加载全部内容