Spring Task
Spring Task串行任务
Spring Task默认的串行执行
在Spring boot启动类上添加注解:@EnableScheduling
1 package com.xuecheng.order.mq; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 import org.springframework.scheduling.annotation.Scheduled; 6 import org.springframework.stereotype.Component; 7 8 @Component 9 public class ChooseCourseTask { 10 11 private static final Logger LOGGER = LoggerFactory.getLogger(ChooseCourseTask.class); 12 @Scheduled(fixedRate = 3000) //上次执行开始时间后3秒执行 13 // @Scheduled(fixedDelay = 5000) //上次执行完毕后5秒执行 14 // @Scheduled(initialDelay=3000, fixedRate=5000) //第一次延迟3秒,以后每隔5秒执行一次 15 // @Scheduled(cron="0/3 * * * * *")//每隔3秒执行一次 16 public void task1(){ 17 LOGGER.info("===============测试定时任务1开始==============="); 18 try { 19 Thread.sleep(5000); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } 23 LOGGER.info("===============测试定时任务1结束==============="); 24 } 25 26 27 @Scheduled(fixedRate = 3000) //上次执行开始时间后3秒执行 28 public void task2(){ 29 LOGGER.info("===============测试定时任务2开始==============="); 30 try { 31 Thread.sleep(5000); 32 } catch (InterruptedException e) { 33 e.printStackTrace(); 34 } 35 LOGGER.info("===============测试定时任务2结束==============="); 36 } 37 }
cron表达式
cron表达式包括6部分:
秒(0~59)
分钟(0~59)
小时(0~23)
月中的天(1~31)
月(1~12)
周中的天(填写MON,TUE,WED,THU,FRI,SAT,SUN,或数字1~7 1表示MON,依次类推)
特殊字符介绍:
“/”字符表示指定数值的增量
“*”字符表示所有可能的值
“-”字符表示区间范围
"," 字符表示列举
“?”字符仅被用于月中的天和周中的天两个子表达式,表示不指定值
例子:
0/3 * * * * * 每隔3秒执行
0 0/5 * * * * 每隔5分钟执行
0 0 0 * * * 表示每天0点执行
0 0 12 ? * WEN 每周三12点执行
0 15 10 ? * MON-FRI 每月的周一到周五10点 15分执行
0 15 10 ? * MON,FRI 每月的周一和周五10点 15分执行
Spring Task并行任务
在项目通常是需要多个不同的任务并行去执行,创建异步任务配置类,需要配置线程池实现多线程调度任务。
将@EnableScheduling添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling
1 import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; 2 import org.springframework.context.annotation.Bean; 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.scheduling.annotation.AsyncConfigurer; 5 import org.springframework.scheduling.annotation.EnableScheduling; 6 import org.springframework.scheduling.annotation.SchedulingConfigurer; 7 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 8 import org.springframework.scheduling.config.ScheduledTaskRegistrar; 9 10 import java.util.concurrent.Executor; 11 12 13 @Configuration 14 @EnableScheduling 15 public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer { 16 17 //线程池线程数量 18 private int corePoolSize = 5; 19 20 @Bean 21 public ThreadPoolTaskScheduler taskScheduler() 22 { 23 ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); 24 scheduler.initialize();//初始化线程池 25 scheduler.setPoolSize(corePoolSize);//线程池容量 26 return scheduler; 27 } 28 29 30 @Override 31 public Executor getAsyncExecutor() { 32 Executor executor = taskScheduler(); 33 return executor; 34 } 35 36 37 @Override 38 public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 39 return null; 40 } 41 42 43 @Override 44 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { 45 scheduledTaskRegistrar.setTaskScheduler(taskScheduler()); 46 } 47 48 }