Spring定时任务scheduled-tasks简单介绍
Spring内部有一个task是Spring自带的一个设定时间自动任务调度,提供了两种方式进行配置,一种是注解的方式,而另外一种就是XML配置方式了。注解方式比较简洁,XML配置方式相对而言有些繁琐,但是应用场景的不同,两者又各有优点,所以具体使用还是根据需求来划分。因为任务调度这样的需求,通常改动都是比较多的,如果用注解的方式改动就变得麻烦了,必须去重新编译。所以更多的时候我选择用XML配置的方式。
Spring定时任务scheduled-tasks配置
(1)XML配置方式
第一步:编写作业类
即普通的pojo,如下:
```java
public class MyTask {
public void execute() {
System.out.println("执行定时任务");
}
}
```
第二步:添加spring-task配置文件,相关头信息如下:
说明:ref参数指定任务类,method指定需要运行的方法,cron及cronExpression表达式见结尾。
ref是工作类
method是工作类中要执行的方法
initial-delay是任务第一次被调用前的延时,单位毫秒
fixed-delay是上一个调用完成后再次调用的延时
fixed-rate是上一个调用开始后再次调用的延时(不用等待上一次调用完成)
cron是表达式,表示在什么时候进行任务调度
第三步:在spring配置文件中引入spring-task配置文件
这样配置就完成了,可以进行测试验证了。
(2)注解方式
首先看下源文件中@Scheduled注解的定义:可以看出该注解有三个方法或者叫参数,分别表示的意思是:
- cron:指定cron表达式
- fixedDelay:官方文档解释:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
下面是关于Spring定时任务的官方文档解释:
fixedRate:这是一个基于时间间隔触发器,其时间间隔是从上一个任务的开始时间计算得出的。时间单位的值以毫秒为单位。
为了说明具体的配置步骤,我们将分为以下三个步骤:
第一步:编写POJO(Plain Old Java Object)类。
第二步:在Spring配置文件中启用task。
第三步:使用注解方式进行配置。这样就实现了Spring定时任务的并行执行。
3. Spring定时任务scheduled-tasks并行执行
默认情况下,Spring的scheduled-tasks是串行执行的。如果task任务数量过多,可能会导致执行任务排队等待。为了解决这个问题,我们需要配置并行执行。只需在配置文件(如XML配置文件)中添加以下配置即可实现并行执行:
cron表达式是一种用于定义定时任务的格式化字符串。它由6个字段组成,每个字段通过空格分隔开。在Spring框架中,可以使用Cron表达式来定义定时任务的执行时间。
下面是一个示例,它表示每隔5分钟执行一次任务:
```
*/5 * * * * ?
```
ron表达式是由6个或7个元素组成的字符串,用于表示定时任务的执行时间。这些元素按照以下顺序排列:
1. 秒(0-59)
2. 分钟(0-59)
3. 小时(0-23)
4. 日期(1-31或者JAN-DEC)
5. 月份(1-12或者JAN-DEC)
6. 星期(1-7或者SUN-SAT)
7. 年份(可选,留空表示从1970年开始计算,/表示每隔几年)
每个元素可以是一个值、一个连续区间、一个间隔时间、一个列表或者通配符。特殊字符包括:`,`、`-`、`*`、`/`。需要注意的是,月份中的日期和星期中的日期这两个元素是互斥的,所以在设置cron表达式时,必须对其中一个元素设置`?`。
示例中给出了一些Cron表达式的用法及其含义:
- `"0 0 12 * * ?"`:每天中午12点触发。
- `"0 15 10 ? * *"`:每天早上10:15触发。
- `"0 15 10 * * ?"`:每天早上10:15触发。
- `"0 15 10 * * ? 2005"`:2005年的每天早上10:15触发。
- `"0 * 14 * * ?"`:每天从下午2点开始到2点59分每分钟一次触发。
- `"0 0/5 14 * * ?"`:每天从下午2点开始到2:55分结束每5分钟一次触发。
- `"0 0/5 14,18 * * ?"`:每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发。
- `"0 0-5 14 * * ?"`:每天14:00至14:05每分钟一次触发。
- `"0 10,44 14 ? 3 WED"`:三月的每周三的14:10和14:44触发。
以下是重构后的内容:
每天触发的规则有以下几种:
1. 每天上午10点,下午2点,4点触发;
2. 朝九晚五工作时间内每半小时触发;
3. 每天中午12点和星期三中午12点触发;
4. 每天下午2点到下午2:59期间的每1分钟触发;
5. 每天下午2点到下午2:55期间的每5分钟触发;
6. 每天下午2点到2:05期间的每1分钟触发;
7. 每年三月的星期三的下午2:10和2:44触发;
8. 周一至周五的上午10:15触发;
9. 每月15日上午10:15触发;
10. 每月最后一日的上午10:15触发;
11. 每月的最后一个星期五上午10:15触发;
12. 2002年至2005年的每月的最后一个星期五上午10:15触发;
13. 每月的第三个星期五上午10:15触发。
子表达式可以包含范围或列表,例如:星期可以从“MON-FRI”变为“MON,WED,FRI”;时间可以用“*”字符表示所有可能的值。
在Excel中,我们可以使用参数来指定日期和时间的计算方式。在这里,我们将介绍一些关于参数的使用注意事项。
首先,我们需要了解“*”字符在表达式中的含义。在月(Month)子表达式中,“*”表示每个月;而在天(Day of Week)子表达式中,“*”表示星期的每一天。
其次,我们使用“/”字符来指定数值的增量。例如,在分钟子表达式中的“0/15”表示从第0分钟开始,每15分钟;而在分钟子表达式中的“3/20”表示从第3分钟开始,每20分钟。这两个表达式的含义是相同的。
此外,“?”字符仅被用于天(月和天(星期两个子表达式,表示不指定值。当两个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”。
接下来,我们来看“L”字符。它仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写。但是它在两个子表达式里的含义是不同的。在天(月子表达式中,“L”表示一个月的最后一天;而在天(星期自表达式中,“L”表示一个星期的最后一天,也就是SAT。如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五。需要注意的是:在使用“L”参数时,不要指定列表或范围,因为这会导致问题。