1.pom依賴:
引入springboot starter包即可
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
2.啓動類啓用定時任務:
在啓動類上加註解:@EnableScheduling即可實現。
@SpringBootApplication
@EnableScheduling
public class OctTaskApplication {
public static void main(String[] args) {
SpringApplication.run(OctTaskApplication.class, args);
}
}
3.創建定時任務實現類(單線程和多線程版本):
3.1 單線程定時任務:
@Component
public class ScheduledTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// String形式的參數,可以從配置文件中加載,方便維護
// @Scheduled(fixedDelayString = "${jobs.fixedDelay}")
@Scheduled(fixedRate = 6000)
public void getTask1() {
System.out.println("定時任務1-----當前時間:" + dateFormat.format(new Date()));
}
@Scheduled(cron = "${jobs.cron}")
public void getTask2() {
System.out.println("定時任務2-----當前時間:" + dateFormat.format(new Date()));
}
}
application.properties
jobs.fixedDelay=6000
jobs.cron=0/5 * * * * ?
運行結果:
2019-05-09 11:19:21.826 INFO 12868 --- [ scheduling-1] p.s.springbootlearn.ScheduledTask : 任務1,從配置文件加載任務信息,當前時間:11:19:21
2019-05-09 11:19:25.001 INFO 12868 --- [ scheduling-1] p.s.springbootlearn.ScheduledTask : 任務2,從配置文件加載任務信息,當前時間:11:19:25
2019-05-09 11:19:26.828 INFO 12868 --- [ scheduling-1] p.s.springbootlearn.ScheduledTask : 任務1,從配置文件加載任務信息,當前時間:11:19:26
2019-05-09 11:19:30.001 INFO 12868 --- [ scheduling-1] p.s.springbootlearn.ScheduledTask : 任務2,從配置文件加載任務信息,當前時間:11:19:30
3.2 多線程定時任務:
加一個多線程配置類,OK
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
結果如下:
可以看到開啓了多個線程
2019-05-09 11:59:50.000 INFO 15140 --- [pool-1-thread-2] p.s.springbootlearn.ScheduledTask : 任務2,從配置文件加載任務信息,當前時間:11:59:50
2019-05-09 11:59:54.294 INFO 15140 --- [pool-1-thread-1] p.s.springbootlearn.ScheduledTask : 任務1,從配置文件加載任務信息,當前時間:11:59:54
2019-05-09 11:59:55.000 INFO 15140 --- [pool-1-thread-3] p.s.springbootlearn.ScheduledTask : 任務2,從配置文件加載任務信息,當前時間:11:59:55
還可以基於註解**@EnableAsync和@Async**異步執行定時任務,也是多線程
@Component
@EnableAsync
public class ScheduledTask {
private final Log logger = LogFactory.getLog(this.getClass());
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Async
@Scheduled(fixedDelayString = "${jobs.fixedDelay}")
public void getTask1() {
logger.info(Thread.currentThread().getName() + "===任務1,從配置文件加載任務信息,當前時間:" + dateFormat.format(new Date()));
}
@Async
@Scheduled(cron = "${jobs.cron}")
public void getTask2() {
logger.info(Thread.currentThread().getName()+ "===任務2,從配置文件加載任務信息,當前時間:" + dateFormat.format(new Date()));
}
}
或者增加配置類定義線程池的一些信息
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(2);
// 設置線程名前綴
scheduler.setThreadNamePrefix("task-");
// 線程內容執行完後60秒停在
scheduler.setAwaitTerminationSeconds(60);
// 等待所有線程執行完
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}
4.參數說明:
@Scheduled的代碼
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 "";
}
@Scheduled接受多種定時參數的設置(主要分爲兩類cornexpression和Rate/Delay表達式):
(1)cron:cron表達式,指定任務在特定時間執行;
(2)fixedDelay:表示上一次任務執行完成後多久再次執行,參數類型爲long,單位ms;
(3)fixedDelayString:與fixedDelay含義一樣,只是參數類型變爲String;
(4)fixedRate:表示按一定的頻率執行任務,參數類型爲long,單位ms;
(5)fixedRateString: 與fixedRate的含義一樣,只是將參數類型變爲String;
(6)initialDelay:表示延遲多久再第一次執行任務,參數類型爲long,單位ms;
(7)initialDelayString:與initialDelay的含義一樣,只是將參數類型變爲String;
(8)zone:時區,默認爲當前時區,一般沒有用到。
☆☆☆☆☆ fixedRate和fixedDelay 的區別
- @Scheduled(fixedRate = 6000):上一次開始執行時間點後每隔6秒執行一次。
- @Scheduled(fixedDelay = 6000):上一次執行完畢時間點之後6秒再執行。
- @Scheduled(initialDelay=1000, fixedRate=6000):第一次延遲1秒後執行,之後按fixedRate的規則每6秒執行一次。
cornexpression表達式詳解:
字段 | 允許值 | 允許特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小時 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 1-12或JAN-DEC | , - * / |
周 | 1-7或SUN-SAT | , - * ? / L C # |
年 | 留空或1970-2099 | , - * / |
cron一共有7位,但是最後一位是年,可以留空,所以我們可以寫6位:
☆☆☆☆☆
* 表示所有值,在分鐘裏表示每一分鐘觸發。在小時,日期,月份等裏面表示每一小時,每一日,每一月。
? 表示不指定值。表示不關心當前位置設置的值。 比如不關心是周幾,則周的位置填寫?。 主要是由於日期跟周是有重複的所以兩者必須有一者設置爲?
- 表示區間。小時設置爲10-12表示10,11,12點均會觸發。
, 表示多個值。 小時設置成10,12表示10點和12點會觸發。
/ 表示遞增觸發。 5/15表示從第5秒開始,每隔15秒觸發。
L 表示最後的意思。 日上表示最後一天。星期上表示星期六或7。 L前加數據,表示該數據的最後一個。
星期上設置6L表示最後一個星期五。 6表示星期五
W 表示離指定日期最近的工作日觸發。15W離該月15號最近的工作日觸發。
#表示每月的第幾個周幾。 6#3表示該月的第三個週五。
示例:
“0 30 8,13 * * ?” 每天8點30 13點30
"0 0 9,14 * * ? #每天9點 14點
"0 50 7,15 * * ? 週一到週五是上午7:20執行,週六是15:20執行
"0 0 12 * * ?" 每天中午12點觸發
“0 15 10 ? * *” 每天上午10:15觸發
“0 15 10 * * ?” 每天上午10:15觸發
“0 15 10 * * ? *” 每天上午10:15觸發
“0 15 10 * * ? 2005” 2005年的每天上午10:15觸發
“0 * 14 * * ?” 在每天下午2點到下午2:59期間的每1分鐘觸發
“0 0/5 14 * * ?” 在每天下午2點到下午2:55期間的每5分鐘觸發
“0 0/5 14,18 * * ?” 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
“0 0-5 14 * * ?” 在每天下午2點到下午2:05期間的每1分鐘觸發
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2: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觸發
每天早上6點 0 6 * * * 每兩個小時 0 */2 * * *
晚上11點到早上8點之間每兩個小時,早上八點 0 23-7/2,8 * * *
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 0 11 4 * 1-3
1月1日早上4點 0 4 1 1 *
Reference : https://blog.csdn.net/u013456370/article/details/79411952