一、使用@Schedule注解方式实现定时任务
1、使用maven创建spring项目,schedule在spring-context.jar的包下边,因此需要导入与之相关的包,如下:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.7.RELEASE</version> </dependency>
2、配置Spring.xml,选择http://www.springframework.org/schema/task
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:task="http://www.springframework.org/schema/task" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"> <!-- 开启定时任务 --> <task:annotation-driven /> </beans>
3、编写定时器类,需要在类上加入@Component注解加入Spring容器,在方法上加入Cron表达式
package scheduleTest; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * spring schedule * * @author Su * */ @Component public class ScheduleTest { @Scheduled(cron = "0/30 * * * * ?") public void scheduleTest() { //每30秒执行一次 //相关逻辑操作,如关闭订单,设置定时关单的时间(建议设置在配置文件中) //查询订单表的创建时间进行相关处理 } }
4、在web.xml中配置Spring上下文监听器
<listener> <listener-class>org.springframework.web.context. ContextLoaderListener</listener-class> </listener>
二、对Spring Schedule Cron表达式的理解
Cron表达式使用格式
Seconds | Minutes | Hours | Day | Month | Week | [Year] |
秒 | 分 | 时 | 天 | 月 | 周 | [年 可选] |
字段名 | 允许的值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
月内日期 | 1-32 | , - * ? / L W C |
月 | 1-12 或 JAN-DEC | , - * / |
周内日期 | 1-7 或 SUN-SAT | , - * ? / L C # |
年 | 留空,1980-2099 | , - * / |
每个符号代表的含义:
*:匹配该域的任意值;如*用在分所在的域,表示每分钟都会触发事件。
?:匹配该域的任意值。月份的天河周的天互相冲突,必须将其中一个设置为?
-:匹配一个特定的范围值;如时所在的域的值是10-12,表示10、11、12点的时候会触发事件。
,:匹配多个指定的值;如周所在的域的值是2,4,6,表示在周一、周三、周五就会触发事件(1表示周日,2表示周一,3表示周二,以此类推,7表示周六)。
/:左边是开始触发时间,右边是每隔固定时间触发一次事件,如秒所在的域的值是5/15,表示5秒、20秒、35秒、50秒的时候都触发一次事件。
L:last,最后的意思,如果是用在天这个域,表示月的最后一天,如果是用在周所在的域,如6L,表示某个月最后一个周五。(外国周日是星耀日,周一是月耀日,一周的开始是周日,所以1L=周日,6L=周五。)
W:weekday,工作日的意思。如天所在的域的值是15W,表示本月15日最近的工作日,如果15日是周六,触发器将触发上14日周五。如果15日是周日,触发器将触发16日周一。如果15日不是周六或周日,而是周一至周五的某一个,那么它就在15日当天触发事件。
#:用来指定每个月的第几个星期几,如6#3表示某个月的第三个星期五
举些例子:
表达式 含义
“0 0 12 * * ?” | 每天12:00触发事件 |
“0 15 10 ? * *” | 每天10:15触发事件 |
“0 15 10 * * ?” | 每天10:15触发事件 |
“0 15 10 * * ? *” | 每天10:15触发事件 |
“0 15 10 * * ? 2005″ | 2005年的每天10:15触发事件 |
“0 * 14 * * ?” | 每天14点开始触发,每分钟触发一次,14:59分结束 |
“0 0/5 14 * * ?” | 每天14点开始触发到14:59分结束的每5分钟触发一次事件 |
“0 0/5 14,18 * * ?” | 每天14点开始到14:59期间和18点到18:59期间的每5分钟触发一次事件 |
“0 0-5 14 * * ?” | 每天14点到14:05期间的每1分钟触发一次事件 |
“0 10,44 14 ? 3 WED” | 每年3月的星期三的14:10和14:44触发一次事件 |
“0 15 10 ? * MON-FRI” | 周一至周五的10:15触发一次事件 |
“0 15 10 15 * ?” | 每月15日10:15触发一次事件 |
“0 15 10 L * ?” | 每月最后一日的10:15触发一次事件 |
“0 15 10 ? * 6L” | 每月的最后一个星期五10:15触发一次事件 |
“0 15 10 ? * 6L 2002-2005″ | 2002年至2005年的每月的最后一个星期五10:15触发一次事件 |
“0 15 10 ? * 6#3″ | 每月的第三个星期五10:15触发一次事件 |
————————————————
本文为网摘文章,原文为以下:
版权声明:本文为CSDN博主「苏启豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a2267378/article/details/82019901
.