複数のタイミングタスクを同時に実行することでシステムがブロックされる問題を解決


通常のタイミングタスクは、1つずつ実行され、同じ時間に複数のタイミングタスクが起動し、データ量の大きいタスクが含まれている場合、他のタイミングタスクがブロックされ、一連の問題が発生します.
解決策:スレッドプールにタイミングタスクを配置します.
1、グローバル@EnableAsync注記を追加し、非同期のサポートを開始する
@EnableAsync //        
@Component
public class sopServiceRecoveryController {
     }

2、@Async注記を追加し、このタイミングタスクを非同期実行に設定する
   @Async("executor1")
    @Scheduled(cron = "0 0/5 * * * ?")
    public void test01(){
     
        logger.info("test01---"+new Date());
        return;
    }

    @Async
    @Scheduled(cron = "0 0/5 * * * ?")
    public void test02(){
     
        logger.info("test02---"+new Date());
        return;
    }

    @Async
    @Scheduled(cron = "0 0/5 * * * ?")
    public void test03(){
     
        logger.info("test03---"+new Date());
        return;
    }


①@ Async("executor 1")注記入力可能なスレッドプール名②この非同期アクチュエータは毎回サブスレッド実行をオンにしているので、パフォーマンス消費が大きいので、自分でスレッドプールを構成するのが望ましい
3、スレッドプールの構成@EnableAsync注釈を使用して、非同期のサポートを開始する
@Configuration
@EnableAsync   //        
public class ThreadPoolTaskExecutorConfig {
     

 //     --   01
 @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;
 }

}


特に注意:独自のスレッドプールが構成されていない場合は、SimpleAsyncTaskExecutorがデフォルトで使用されます.