作者:如梦幻般的童心_900 | 来源:互联网 | 2022-03-02 03:18
这篇文章主要介绍了SpringMVCCron定时器Demo常见问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
该技术的不适用的场景
如果在集群环境下,多台服务器中只希望有一台执行,那 Spring 自带的这种定时器方式可能不太符合你的需要。
但是,如果每台服务器都需要独立执行该定时器任务,且相互之间不存在同步,那么还是可以考虑的
SpringMVC 定时器
本文着重介绍的是 SpringMVC 配置定时器的方式,而不是 SpringBoot 配置定时器的方式。
注解方式
首先,在 Clock 类上添加 @Component,然后,在需要定时执行的方法上面加上 @Scheduled,最后指定 cron 表达式。
项目结构:
Clock.java
package coderead.spring.scheduled;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Clock {
// 每5秒钟执行一次
@Scheduled(cron = "*/5 * * * * ?")
public void testTime() {
System.out.println(new Date());
}
}
spring-mvc.xml
<&#63;xml version="1.0" encoding="UTF-8"&#63;>
web.xml
<&#63;xml version="1.0" encoding="UTF-8"&#63;>
contextConfigLocation
classpath:spring/spring-mvc.xml
org.springframework.web.context.ContextLoaderListener
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
1
dispatcherServlet
/
pom.xml
<&#63;xml version="1.0" encoding="UTF-8"&#63;>
4.0.0
coderead.spring
spring-scheduled-test
1.0-SNAPSHOT
war
5.1.6.RELEASE
UTF-8
org.springframework
spring-webmvc
${spring.version}
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
UTF-8
org.eclipse.jetty
jetty-maven-plugin
9.4.33.v20201020
如果你不知道怎么用 jetty 启动项目,你可以考虑参考 使用maven-Jetty9-plugin插件运行第一个Servlet
xml 配置方式
如果你需要使用 xml 配置,你会发现 @Scheduled 注解和 有着相同的属性。因此我们将上一节的代码稍稍改动一下:
Clock.java 去掉注解
package coderead.spring.scheduled;
import java.util.Date;
public class Clock {
public void testTime() {
System.out.println(new Date());
}
}
spring-mvc.xml
<&#63;xml version="1.0" encoding="UTF-8"&#63;>
常见问题
@Scheduled 定时任务不生效
@Scheduled定时任务不生效???
- 此方法不能有参数
- 此方法不能有返回值
- 此类中不能包含其他带任何注解的方法(发现新大陆)
还有一种可能就是没有在 spring-mvc.xml 文件中加入 而不仅仅是加入
@Scheduled 定时任务执行两次
@Scheduled Spring定时任务每次执行两次解决方案
主要原因是 web.xml 同时设置了 和 都设置了 contextConfigLocation,两次加载配置文件
contextConfigLocation
classpath:spring/spring-mvc.xml
...
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-mvc.xml
1
...
cron 表达式
cron 表达式是用来规定代码执行周期的一种表达式,cron表达式详解 这篇文章详细的讲解了 cron 表达式的使用细节。
以我的浅陋的经验,我对 cron 表达式的记忆是:
常用的 cron 表达式由 6 个域组成,域和域之间以空格分开
域从左到右,时间单位从秒开始逐步增大。他们分别是 "秒 分 时 日期 月份 星期"
因为日期和星期会相互影响,通常如果其中一个用 非&#63; 表示任意,则另一个必须用 &#63; 表示“任意”。
原因:通常,在指定日期条件之后,我们虽然希望“任意星期几”,但是实际上,此时星期需要根据日期的变化而相应变化,做不到完全任意。
你还可以通过 在线 Cron 表达式 来帮助你理解前人代码中的 cron 表达式的含义,或者根据你的需求生成一个新的 cron 表达式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。