根据分布式事务的研究结果,订单服务需要定时扫描任务表向MQ发送任务。本节研究定时任务处理的方案,并实 现定时任务扫描任务表并向MQ发送消息。
实现定时任务的方案如下:
在Spring boot启动类上添加注解:@EnableScheduling
新建任务测试类TestTask,编写测试方法如下:
@Component
public class ChooseCourseTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ChooseCourseTask.class);
// @Scheduled(fixedRate = 5000)
// 上次执行开始时间后5秒执行
// @Scheduled(fixedDelay = 5000)
// 上次执行完毕后5秒执行
// @Scheduled(initialDelay=3000, fixedRate=5000)
// 第一次延迟3秒,以后每隔5秒执行一次 @Scheduled(cron="0/3 * * * * *")
// 每隔3秒执行一次
public void task1() {
LOGGER.info("===============测试定时任务1开始===============");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("===============测试定时任务1结束===============");
}
}
测试:
cron表达式包括6部分:
特殊字符介绍:
例子:
参考 task1方法的的定义方法,再定义task2方法,此时共用两个任务方法。
@Scheduled(fixedRate = 3000)
//上次执行开始时间后5秒执行
public void task2() {
LOGGER.info("===============测试定时任务2开始===============");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("===============测试定时任务2结束===============");
}
通过测试发现,两个任务方法由一个线程串行执行,task1方法执行完成task2再执行。
在项目通常是需要多个不同的任务并行去执行。 本节实现Spring Task并行执行任务的方法。
创建异步任务配置类,需要配置线程池实现多线程调度任务。
@Configuration
@EnableScheduling
public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
//线程池线程数量
private int corePoolSize = 5;
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
//初始化线程池
scheduler.setPoolSize(corePoolSize);
//线程池容量
return scheduler;
}
@Override
public Executor getAsyncExecutor() {
Executor executor = taskScheduler();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
将@EnableScheduling
添加到此配置类上,SpringBoot启动类上不用再添加@EnableScheduling
通过测试发现两个任务由不同的线程在并行执行,互不影响。