Spring 配置的@Scheduled(cron = "0 1/5 5-21 * *?")任务,在同一时刻重复执行,求解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 配置的@Scheduled(cron = "0 1/5 5-21 * *?")任务,在同一时刻重复执行,求解决方法相关的知识,希望对你有一定的参考价值。

Spring 配置的@Scheduled(cron = "0 1/5 5-21 * *?")任务,在同一时刻重复执行。。。Spring 配置扫描package @Service

参考技术A 转的,我就是用这种方法解决的
这是因为我们很容易在一个基于Spring的Web工程中启动2个定时线程:
第一次:web容器启动的时候,读取applicationContext.xml(或者别的Spring核心配置文件)文件时,会加载一次。
第二次:Spring本身会加载applicationContext.xml(或者别的Spring核心配置文件)一次。
解决方案:将你的Task的相关配置独立出来并在web.xml中通过context-param加载。而不是通过spring加载。
1) 独立出Spring-Task,如新命名一个文件名叫cms_quartz.xml
2) 在web.xml中去加载该文件:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/cms-servlet.xml,classpath:cms-quartz.xml</param-value>
<context-param>
参考技术B 股份琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐 参考技术C 你这个的配置不就是每天从5点到21 点,从1 分钟开始每5分钟循环执行么? 有什么不对吗?追问

问题是这个任务在同一时刻执行了2遍...就是说会在6分钟的时候执行两遍...

追答

你看看你的代码是否有问题? 配置应该是这样的,有可能就是你在代码里面调用了两次!

追问

感觉这个task类加载了两次,但纵观所有的配置文件,找不到哪加载了两次...

Spring @Scheduled定时任务动态修改cron参数

  1. 在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接口。(值得注意的是:@EnableScheduling对Spring的版本要求比较高,一开始使用的3.2.6版本时一直未成功,后来改成4.2.5版本就可以了)
  2. 设置一个静态变量cron,用于存放任务执行周期参数。
  3. 另辟一线程,用于模拟实际业务中外部原因修改了任务执行周期。
  4. 设置任务触发器,触发任务执行,其中就可以修改任务的执行周期。

 

啦啦啦

以上是关于Spring 配置的@Scheduled(cron = "0 1/5 5-21 * *?")任务,在同一时刻重复执行,求解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring @SCHEDULED(CRON = "0 0 * * * ?")实现定时任务

来自属性文件的 Spring @Scheduled cron 详细信息 - 异常

Spring定时任务@Scheduled的cron表达式

Spring@Scheduled注解cron详解

Spring @Scheduled定时任务的fixedRate,fixedDelay,cron的作用和不同

Spring @Scheduled定时任务动态修改cron参数