SpringBoot中配置定时任务、线程池与多线程池执⾏的⽅
配置基础的定时任务
最基本的配置⽅法,⽽且这样配置定时任务是单线程串⾏执⾏的,也就是说每次只能有⼀个定时任务可以执⾏,可以试着声明两个⽅法,在⽅法内写⼀个死循环,会发现⼀直卡在⼀个任务上不动,另⼀个也没有执⾏。
1、启动类
添加@EnableScheduling开启对定时任务的⽀持
@EnableScheduling
@SpringBootApplication
public class TestScheduledApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.Class());
}
public static void main(String[] args) {
new SpringApplicationBuilder(TestScheduledApplication.class).web(true).run(args);
}
}
2、配置执⾏定时任务的类
添加@Component扫描本类,在⽅法上添加@Scheduled注解声明定时任务,配置时间周期
@Component
public class TestTask1 {
private static final Logger logger = Logger();
// 间隔1秒执⾏⼀次
@Scheduled(cron = "0/1 * * * * ?")
public void method1() {
logger.info("——————————method1 start——————————");
logger.info("——————————method1 end——————————");
}
}
配置线程池执⾏定时任务
因为有时候需要执⾏的定时任务会很多,如果是串⾏执⾏会带来⼀些问题,⽐如⼀个很耗时的任务阻塞住了,⼀些需要短周期循环执⾏的任务也会卡住,所以可以配置⼀个线程池来并⾏执⾏定时任务
1、配置线程池
添加@EnableAsync开启对异步的⽀持
@Configuration
@EnableAsync
public class ExecutorConfig {
@Bean
public Executor executor1() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("test-schedule2-");
executor.setMaxPoolSize(20);
executor.setCorePoolSize(15);
executor.setQueueCapacity(0);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
2、配置定时任务异步执⾏
添加@Async注解,表⽰该定时任务是异步执⾏的,因为上⾯线程池配置了名字,所以可以看到打印的⽇志是该线程池中的线程在执⾏任务,如果没有配置线程池的话会默认使⽤SimpleAsyncTaskExecutor,这个异步执⾏器每次都会开启⼀个⼦线程执
⾏,性能消耗⽐较⼤,所以最好是⾃⼰配置线程池
@Async
@Scheduled(cron = "0/1 * * * * ?")
public void method1() {
logger.info("——————————method1 start——————————");
logger.info("——————————method1 end——————————");
}
配置多个线程池分别执⾏不同的定时任务
因为有些定时任务是⽐较重要的,有些则是不太重要的,想把定时任务分别放到不同的线程池中,也是可以实现的。
1、配置多个线程池
分别配置两个线程池
@Configuration
@EnableAsync
public class ExecutorConfig1 {
@Bean
public Executor executor1() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("test-schedule1-");
executor.setMaxPoolSize(20);
executor.setCorePoolSize(15);
executor.setQueueCapacity(0);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
@Bean
public Executor executor2() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix("test-schedule2-");
executor.setMaxPoolSize(20);
executor.setCorePoolSize(15);
executor.setQueueCapacity(0);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
2、定时任务显⽰指定调⽤线程池
因为上⾯在配置类⾥⾯初始化了两个线程池,所以会有两个线程池分别叫executor1和executor1被⽣成放到容器中,因为
@Bean注解⽣成的对象默认就是和⽅法名相同的名字,⽽@Async注解是可以指定使⽤哪个线程池的。这样就可以在不同的线程池中执⾏不同的定时任务了
// 间隔1秒执⾏⼀次
@Async("executor1")
@Scheduled(cron = "0/1 * * * * ?")
public void method1() {
logger.info("——————————method1 start——————————");
logger.info("——————————method1 end——————————");
}
// 间隔1秒执⾏⼀次
@Scheduled(cron = "0/1 * * * * ?")
@Async("executor2")
public void method2() {
logger.info("——————————method2 start——————————");
logger.info("——————————method2 end——————————");
}
注意:
1. 没有配置⾃⼰的线程池时,会默认使⽤SimpleAsyncTaskExecutor。
2. 如果项⽬中只配置了⼀个线程池,那么不需要显⽰指定使⽤这个线程池,spring也会⾃动使⽤⽤户配置的线程池,但是
如果配置了多个就必须要显⽰指定,否则还是会使⽤默认的。springboot原理和生命周期
3. 如果想要指定使⽤哪个线程池,可以使⽤@Async("executor2")显⽰指定。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。