SpringBoot入門 (十二) 定時任務

本文記錄在SpringBoot中使用定時任務。java

  在咱們的項目中,常常須要用到定時任務去幫咱們作一些事情,好比服務狀態監控,業務數據狀態的更改等,SpringBoot中實現定時任務有2中方案,一種是自帶的,咱們只須要加上註解便可;另外一種是集成Quartz來實現定時任務。spring

一 SpringBoot 提供的定時任務

  在SpringBoot的starter包中已經提供了對定時任務的支持,咱們很容易實現定時任務。修改pom.xml文件,加入以下內容,引入依賴:框架

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

  在啓動類上加註@EnableScheduling 註解,開啓定時任務ide

@SpringBootApplication
@EnableScheduling
public class TimingTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(TimingTaskApplication.class, args);
    }

}

  建立定時任務類及要定時執行的方法spring-boot

@Component
public class ScheduleTaskDemo {

    private int num1 = 0;
    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Scheduled(cron = "*/5 * * * * ?")
    public void test1(){
        System.out.println("這是test1方法第"+ (++num1) + "次執行,執行時間:"+df.format(new Date()));
    }

}

  @Component 註解 將當前類交給Spring容器管理ui

  @Scheduled 註解標明方法是一個定時執行的方法spa

  啓動項目後能夠看到控制檯打印出的信息orm

  @Scheduled 註解有幾個參數可使用,每一個參數的意義不同,參數及執行規則說明以下:xml

  fixedRate @Scheduled(fixedRate = 5000) 上一次開始執行時間點以後每5秒執行一次;blog

  fixedDelay @Scheduled(fixedDelay = 5) 上一次執行完畢時間點以後每5秒執行一次;

  initialDelay @Scheduled(initialDelay = 1, fixedDelay = 6) 第一次延遲1秒後執行,以後按照fixedRate的規則執行;

  cron @Scheduled(cron = "*/5 * * * * ?") 一個表達式,一共有7位,通常只須要設置6爲就能夠了

  第一位:秒,取值範圍是0-59;

  第二位:分,取值範圍是0-59;

  第三位:時,取值範圍0-23;

  第四位:日,取值範圍1-31;

  第五位:月,取值範圍1-12;

  第六位:星期,取值範圍1-7,1表明星期日,2表明星期一,7表明星期六;

  第七位:年,取值範圍1970-099,能夠不設置。

  cron表達式也能夠在http://cron.qqe2.com進行在線生成。

 二 SpringBoot集成Quartz

     Quartz是用Java編寫的一個開源的任務調度框架。提供了豐富的Api供調用,支持集羣環境和持久化,支持多種配置,與SpringBoot能夠無縫集成。

  Quartz幾個關鍵元素:

  Job  表明要執行的任務,是個接口,提供了一個方法 execute(JobExecutionContext context);

  JobDetail  表明具體的要執行的任務;

  Trigger  表明調度任務的觸發器,配置調度任務的執行規則;

  Scheduler  表明調度容器,一個調度容器中能夠註冊多個JobDetail和Trigger。

  元素關係以下圖:

  SpringBoot對Quartz已經提供了支持,咱們能夠很容易的使用,在pom.xml文件中引入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

  在啓動類上加註解 @EnableScheduling ,開啓定時執行。

  建立一個要執行的任務繼承QuartzJobBean,輸出任務執行時間

public class MyTask1 extends QuartzJobBean {

    private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("MyTask1 執行時間:" + df.format(new Date()));
    }

}

  建立一個配置類,初始化MyTask1任務所須要的JobDetail和Trigger

@SpringBootConfiguration
public class QuartzConfig {

    @Bean
    public JobDetail myTask1JobDetail(){
        return JobBuilder.newJob(MyTask1.class).withIdentity("myTask1").storeDurably().build();
    }

    @Bean
    public Trigger myTask1Trigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                //5秒執行一次
                .withIntervalInSeconds(5)
                .repeatForever();
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                //指定觸發器對應的JobDetail
                .forJob(myTask1JobDetail())
                .withIdentity("myTask1")
                .withSchedule(scheduleBuilder).build();
        return trigger;
    }

}

  啓動項目,能夠看到控制檯輸出的內容

    在上邊的方法,咱們使用的定時執行方法是在代碼中寫的固定值,這種侷限性比較大,難以知足一些複雜的定製任務執行時間。咱們使用Cron表達式來完成定時任務執行時間配置。

  建立任務類,繼承QuartzJobBean

public class MyTask2 extends QuartzJobBean {

    private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("MyTask2 執行時間:" + df.format(new Date()));
    }

}

  在配置類QuartzConfig中建立任務所需的JobDetail和Trigger

@Bean
    public JobDetail myTask2JobDetail(){
        return JobBuilder.newJob(MyTask2.class).withIdentity("myTask2").storeDurably().build();
    }

    @Bean
    public Trigger myTask2Trigger(){
        //cron 表達式
        String cronStr = "*/10 * * * * ?";
        //根據表達式設置ScheduleBuilder
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronStr);
        CronTrigger trigger = TriggerBuilder.newTrigger()
                //指定JobDetail
                .forJob(myTask2JobDetail())
                .withIdentity("myTask2")
                //指定ScheduleBuilder
                .withSchedule(cronScheduleBuilder)
                .build();
        return trigger;
    }

  重啓項目,看到控制檯輸出內容,任務1每5秒執行一次,任務2每10秒執行一次

 

相關文章
相關標籤/搜索