在使用Scheduled做定时任务时,默认是单个线程执行,如果有一个线程执行较慢或出现异常情况则会影响其他定时任务执
行情况!!!所以我们需要配置成多线程,避免这些问题。
添加@EnableScheduling支持并配置线程池
package com.zbscxy.onecardtb.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* 配置 schedule线程池
*/
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(20); //指定线程池大小
}
/**
* 异步线程池设置
* @return
*/
// @Bean
// public SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() {
// SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
// simpleAsyncTaskExecutor.setConcurrencyLimit(2); //设置最大并行数
// simpleAsyncTaskExecutor.setDaemon(true); //设置为守护线程
// return simpleAsyncTaskExecutor;
// }
}
配置定时任务并异步执行
1.启动类添加定时任务与异步注解
@EnableAsync
@EnableScheduling
2.添加线程池配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
* 配置 schedule线程池
*/
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
//, AsyncConfigurer
// 并行任务
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// taskRegistrar.setScheduler(taskScheduler());
}
// 并行任务使用策略:多线程处理(配置线程数等)
@Bean("abc1")
public TaskScheduler classStuTbScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("task-1-");
scheduler.setPoolSize(30);
scheduler.initialize();
return scheduler;
}
@Bean("abc2")
public TaskScheduler consumeTbScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("task-2-");
scheduler.setPoolSize(20);
scheduler.initialize();
return scheduler;
}
@Bean("abc3")
public TaskScheduler oneDayTbScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("task-3-");
scheduler.setPoolSize(10);
scheduler.initialize();
return scheduler;
}
// @Bean
// public ThreadPoolTaskScheduler taskScheduler(){
// ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// scheduler.setPoolSize(40);
// scheduler.setThreadNamePrefix("yb-"); //设置线程名开头
// scheduler.setAwaitTerminationSeconds(60);
// scheduler.setWaitForTasksToCompleteOnShutdown(true);
// return scheduler;
// }
// // 异步任务
// public Executor getAsyncExecutor(){
// Executor executor = taskScheduler();
// return executor;
// }
//
// // 异步任务 异常处理
// public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){
// return new SimpleAsyncUncaughtExceptionHandler();
// }
}
3.task类设置异步线程池
/**
* 同步
* 每隔两分钟执行一次
*/
@Async("abc1")
@Scheduled(cron = "0 0/2 * * * ?")
public void asynTb() {
//业务代码
System.out.printIn("--------------begin-------------end-----------");
}