Spring Boot 內置定時器的使用


定時器又叫定時任務、計划任務,在項目開發中使用比較普遍,它能夠定時執行規定的任務,例如:訂單到期處理、會員到期處理、數據報表生成等

Springboot內置的定時任務  默認是單線程,使用非常方便,使用時要在Application中設置啟用定時任務功能@EnableScheduling,代碼如下:

1.啟用定時任務功能

@SpringBootApplication
@EnableScheduling
@MapperScan("main.blog.mapper")

public class BootApplication {

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

2.使用@Scheduled注解執行定時任務

使用 @Scheduled來創建定時任務 這個注解用來標注一個定時任務方法。 
通過看 @Scheduled源碼可以看出它支持多種參數:
(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:時區,默認為當前時區,一般沒有用到。

單線程定時任務的使用,代碼如下:

package com.blog.controller;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;

@Controller("Task")
public class TaskController
{
    private static final Logger logger = LoggerFactory.getLogger(TaskController.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:mm:dd HH:mm:ss");
    
    /**
     * 方法一:cron方式,項目啟動后每5秒執行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void cronTask() 
    {
        logger.info("Cron方式-定時任務執行時間:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法二:fixedRate方式,上一次的開始時間與下一次的開始時間為基點,項目啟動時會執行一次,然后每5秒執行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask()
    {
        logger.info("fixedRate方式-定時任務執行時間:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法二:fixedRate方式,項目啟動時2秒后會執行一次,然后每5秒執行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(initialDelay = 2000,fixedRate = 5000)
    public void fixedRateInitialDelayTask() 
    {
        logger.info("initialDelay方式-定時任務執行時間:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法三:fixedDelay方式,上一次的結束時間與下一次的開始時間為基點,項目啟動時會執行一次,然后每5秒執行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(fixedDelay = 5000)
    public void fixedDelayTask()
    {
        logger.info("fixedDelay方式-定時任務執行時間:"+ dateFormat.format(new Date()));
    }
    
    /**
     * 方法三:fixedDelay方式,項目啟動時2秒后會執行一次,然后每5秒執行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(initialDelay = 2000, fixedDelay = 5000)
    public void initialDelayFixedDelayTask() 
    {
      logger.info("initialDelay方式-定時任務執行時間:"+ dateFormat.format(new Date()));
    }
}

 

3.多線程定時任務的使用

在config下新增配置文件SchedulerConfig.java ,配置自定義線程池,代碼如下:

@Configuration
@EnableScheduling  //開啟定時器
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //多線程配置
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }

    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }
}
然后再用@Scheduled執行任務時,就已經是多線程任務啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM