一、使用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