Spingboot定時任務

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章