更新于 

定时任务

根据需要,新建MonitorSchedule类来实现监测服务的定时运行

基于注解(@Scheduled)

基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。

  • @EnableScheduling : 在配置类上使用,开启计划任务的支持
  • @Scheduled : 来声明这是一个任务,包括 cron,fixDelay,fixRate 等类型
定时调用监测服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Service
@EnableScheduling
public class MonitorSchedule {
@Value("${settings.monitor.startIndex}")
private int index;
@Value("${settings.monitor.partition}")
private int partition;
private String monitorIP;
@Autowired
private MonitorService monitorService;

@Scheduled(fixedDelayString = "${settings.monitor.fixedDelay:600000}",initialDelay = 3000)
public void FunctionTimerTask() {
String newIP = new GetMonitorIP().GetIP();
if(newIP!=null){monitorIP = newIP;}
monitorService.FunctionMonitor(index,monitorIP);
index=(index+1)%partition;
}
}

@Scheduled - Cron

Scheduled注解类源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String CRON_DISABLED = "-";

String cron() default "";

String zone() default "";

long fixedDelay() default -1L;

String fixedDelayString() default "";

long fixedRate() default -1L;

String fixedRateString() default "";

long initialDelay() default -1L;

String initialDelayString() default "";
}

cron 表达式语法: 小时

1
@Scheduled(cron = "0/5 * * * * ?")
说明 是否必填 允许填写的值 允许的通配符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
1-31 , - * ? / L W
1-12 or JAN-DEC , - * /
1-7 or MON-SUN , - * ? / L #
empty 或 1970-2099 , - * /
通配符含义

, : 表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
- : 表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发
* : 表示所有值. 例如:在分的字段上设置,表示每一分钟都会触发
/ : 用于递增触发。如在秒上面设置”5/15” 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置’1/3’所示每月1号开始,每隔三天触发一次
L : 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年), 在周字段上表示星期天,相当于”7”或”SUN”。如果在”L”前加上数字,则表示该数据的最后一个。例如在周字段上设置”6L”这样的格式,则表示“本月最后一个星期六”
W : 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置”15W”,表示离每月15号最近的那个工作日触发,如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,”W”前只能设置具体的数字,不允许区间”-“).
LW : 表示在本月的最后一个工作日触发
# : 表示每月的第几个周几,例如在周字段上设置”6#3”表示在每月的第三个周六.注意如果指定”6#5”,正好第五周没有周六,则不会触发该配置

@Scheduled - Zone

时区,接收一个 java.util.TimeZone#ID 。cron表达式会基于该时区解析,默认是一个空字符串,即取服务器所在地的时区。

1
@Scheduled(cron ="0 0 14 * * *", zone ="GMT-5")

@Scheduled - fixedDelay

上一次 执行完毕 时间点之后多长时间再执行:

1
@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行

@Scheduled - fixedDelayString

fixedDelay意思相同,只是使用字符串的形式,支持占位符:

1
2
3
@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行
//占位符
@Scheduled(fixedDelayString = "${settings.monitor.fixedDelay:5000}") //根据配置文件设置间隔,默认上一次执行完毕时间点之后5秒再执行

@Scheduled - fixedRate

上一次 开始执行 时间点之后多长时间再执行:

1
@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行

@Scheduled - fixedRateString

fixedRate意思相同,只是使用字符串的形式,支持占位符:

1
2
3
@Scheduled(fixedRateString = "5000") //上一次开始执行时间点之后5秒再执行
//占位符
@Scheduled(fixedRateString = "${settings.monitor.fixedRate:5000}") //根据配置文件设置间隔,默认上一次开始执行时间点之后5秒再执行

@Scheduled - initialDelay

第一次 延迟多长时间后再执行:
1
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

@Scheduled - initialDelayString

initialDelay意思相同,只是使用字符串的形式,支持占位符:

1
@Scheduled(initialDelay="${settings.monitor.initialDelay:1000}", fixedRate=5000) ////根据配置文件设置间隔,默认第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次