springboot 定時任務

一、使用springboot默認提供的線程執行 下面已經足夠使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@EnableScheduling
@Component
public class SchedulingDemo {

    private Logger logger = LoggerFactory.getLogger(SchedulingDemo.class);
    /**
     * 刪除數據定時
     */
    private static final String CORE_FORMAT = "0/5 * * * * ?";

    @Scheduled(cron = CORE_FORMAT)
    public void scheduleLimitRule() {
        try {
            System.out.println(" Timer:  Delete Export Template File With Schedule At {} Begin....."+ CORE_FORMAT);

            System.out.println("================= I already run");

        } catch (Exception e){
            e.printStackTrace();
            System.out.println(" Timer:  Delete Delete Export Template File Meets An Error {}"+ e.getMessage());
        }
    }


    private int fixedDelayCount = 1;
    private int fixedRateCount = 1;
    private int initialDelayCount = 1;
    private int cronCount = 1;

    @Scheduled(fixedDelay = 5000)        //fixedDelay = 5000表示當前方法執行完畢5000ms後,Spring scheduling會再次調用該方法
    public void testFixDelay() {
        logger.info("===fixedDelay: 第{}次執行方法", fixedDelayCount++);
    }

    @Scheduled(fixedRate = 5000)        //fixedRate = 5000表示當前方法開始執行5000ms後,Spring scheduling會再次調用該方法
    public void testFixedRate() {
        logger.info("===fixedRate: 第{}次執行方法", fixedRateCount++);
    }

    @Scheduled(initialDelay = 1000, fixedRate = 5000)   //initialDelay = 1000表示延遲1000ms執行第一次任務
    public void testInitialDelay() {
        logger.info("===initialDelay: 第{}次執行方法", initialDelayCount++);
    }

    @Scheduled(cron = "0/1 * * * * ?")  //cron接受cron表達式,根據cron表達式確定定時規則
    public void testCron() {
        logger.info("===initialDelay: 第{}次執行方法", cronCount++);
    }


}
==============================================愚蠢的分割線======================================================
需要走自己規劃好的線程池,加上如下部分即可
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.*;


@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        //設定一個長度20的定時任務線程池
        scheduledTaskRegistrar.setScheduler(taskExecutor());
        //Executors.newScheduledThreadPool(20)
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
       // Executors.newScheduledThreadPool(15); //指定線程池大小
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10,Executors.defaultThreadFactory(), new  ThreadPoolExecutor.CallerRunsPolicy());

        return executor;
    }
}

參考:

//https://blog.csdn.net/u013456370/article/details/79411952
//https://segmentfault.com/a/1190000020299913?utm_source=tag-newest
發佈了13 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章