溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring Boot中如何配置定時任務(wù)、線程池與多線程池執(zhí)行

發(fā)布時間:2021-08-07 13:14:12 來源:億速云 閱讀:250 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)Spring Boot中如何配置定時任務(wù)、線程池與多線程池執(zhí)行的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

配置基礎(chǔ)的定時任務(wù)

最基本的配置方法,而且這樣配置定時任務(wù)是單線程串行執(zhí)行的,也就是說每次只能有一個定時任務(wù)可以執(zhí)行,可以試著聲明兩個方法,在方法內(nèi)寫一個死循環(huán),會發(fā)現(xiàn)一直卡在一個任務(wù)上不動,另一個也沒有執(zhí)行。

1、啟動類

添加@EnableScheduling開啟對定時任務(wù)的支持

@EnableScheduling
@SpringBootApplication
public class TestScheduledApplication extends SpringBootServletInitializer {

 @Override 
 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  return builder.sources(this.getClass());
 }

 public static void main(String[] args) {
  new SpringApplicationBuilder(TestScheduledApplication.class).web(true).run(args);
 }
}

2、配置執(zhí)行定時任務(wù)的類

添加@Component掃描本類,在方法上添加@Scheduled注解聲明定時任務(wù),配置時間周期

@Component
public class TestTask1 {
 private static final Logger logger = LogManager.getLogger();

 // 間隔1秒執(zhí)行一次
 @Scheduled(cron = "0/1 * * * * ?")
 public void method1() {
  logger.info("——————————method1 start——————————");
  logger.info("——————————method1 end——————————");
 }
}

配置線程池執(zhí)行定時任務(wù)

因為有時候需要執(zhí)行的定時任務(wù)會很多,如果是串行執(zhí)行會帶來一些問題,比如一個很耗時的任務(wù)阻塞住了,一些需要短周期循環(huán)執(zhí)行的任務(wù)也會卡住,所以可以配置一個線程池來并行執(zhí)行定時任務(wù)

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、配置定時任務(wù)異步執(zhí)行

添加@Async注解,表示該定時任務(wù)是異步執(zhí)行的,因為上面線程池配置了名字,所以可以看到打印的日志是該線程池中的線程在執(zhí)行任務(wù),如果沒有配置線程池的話會默認使用SimpleAsyncTaskExecutor,這個異步執(zhí)行器每次都會開啟一個子線程執(zhí)行,性能消耗比較大,所以最好是自己配置線程池

@Async
@Scheduled(cron = "0/1 * * * * ?")
public void method1() {
 logger.info("——————————method1 start——————————");
 logger.info("——————————method1 end——————————");
}

配置多個線程池分別執(zhí)行不同的定時任務(wù)

因為有些定時任務(wù)是比較重要的,有些則是不太重要的,想把定時任務(wù)分別放到不同的線程池中,也是可以實現(xiàn)的。

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、定時任務(wù)顯示指定調(diào)用線程池

因為上面在配置類里面初始化了兩個線程池,所以會有兩個線程池分別叫executor1和executor1被生成放到容器中,因為@Bean注解生成的對象默認就是和方法名相同的名字,而@Async注解是可以指定使用哪個線程池的。這樣就可以在不同的線程池中執(zhí)行不同的定時任務(wù)了

// 間隔1秒執(zhí)行一次
@Async("executor1")
@Scheduled(cron = "0/1 * * * * ?")
public void method1() {
 logger.info("——————————method1 start——————————");
 logger.info("——————————method1 end——————————");
}

// 間隔1秒執(zhí)行一次
@Scheduled(cron = "0/1 * * * * ?")
@Async("executor2")
public void method2() {
 logger.info("——————————method2 start——————————");
 logger.info("——————————method2 end——————————");
}

注意:

  1. 沒有配置自己的線程池時,會默認使用SimpleAsyncTaskExecutor。

  2. 如果項目中只配置了一個線程池,那么不需要顯示指定使用這個線程池,spring也會自動使用用戶配置的線程池,但是如果配置了多個就必須要顯示指定,否則還是會使用默認的。

  3. 如果想要指定使用哪個線程池,可以使用@Async("executor2")顯示指定。

感謝各位的閱讀!關(guān)于“Spring Boot中如何配置定時任務(wù)、線程池與多線程池執(zhí)行”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI