SpringMVC Cron定时器Demo常见问题解决方案

网友投稿 237 2023-02-19

SpringMVC Cron定时器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

xmlns:mvc="http://springframework.org/schema/mvc"

xmlns:task="http://springframework.org/schema/task"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task.xsd">

xmlns:mvc="http://springframework.org/schema/mvc"

xmlns:task="http://springframework.org/schema/task"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task.xsd">

web.xml

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

contextConfigLocation

classpath:spring/spring-mvc.xml

org.springframework.web.context.ContextLoaderListener

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

1

dispatcherServlet

/

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

contextConfigLocation

classpath:spring/spring-mvc.xml

org.springframework.web.context.ContextLoaderListener

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

1

dispatcherServlet

/

pom.xml

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

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

1.8

UTF-8

org.eclipse.jetty

jetty-maven-plugin

9.4.33.v20201020

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

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

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

xmlns:mvc="http://springframework.org/schema/mvc"

xmlns:task="http://springframework.org/schema/task"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task.xsd">

xmlns:mvc="http://springframework.org/schema/mvc"

xmlns:task="http://springframework.org/schema/task"

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/mvc

http://springframework.org/schema/mvc/spring-mvc.xsd

http://springframework.org/schema/context

http://springframework.org/schema/context/spring-context.xsd

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task.xsd">

常见问题

@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 个域组成,域和域之间以空格分开

域从左到右,时间单位从秒开始逐步增大。他们分别是 "秒 分 时 日期 月份 星期"

因为日期和星期会相互影响,通常如果其中一个用 非? 表示任意,则另一个必须用 ? 表示“任意”。

原因:通常,在指定日期条件之后,我们虽然希望“任意星期几”,但是实际上,此时星期需要根据日期的变化而相应变化,做不到完全任意。

你还可以通过 在线 Cron 表达式 来帮助你理解前人代码中的 cron 表达式的含义,或者根据你的需求生成一个新的 cron 表达式。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:怎么识别新的营业执照代码(新版营业执照怎么看注册号)
下一篇:电商平台接口Api文档(电商支付接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~