ScheduleConfig.java 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package org.dbsyncer.common.config;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.scheduling.annotation.SchedulingConfigurer;
  7. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  8. import org.springframework.scheduling.config.ScheduledTaskRegistrar;
  9. import java.util.concurrent.RejectedExecutionHandler;
  10. /**
  11. * @author yjwang
  12. * @date 2022/4/29 10:27
  13. */
  14. @Configuration
  15. public class ScheduleConfig implements SchedulingConfigurer {
  16. private final Logger logger = LoggerFactory.getLogger(getClass());
  17. @Override
  18. public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
  19. scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
  20. }
  21. @Bean(name = "taskScheduler", destroyMethod = "shutdown")
  22. public ThreadPoolTaskScheduler taskScheduler() {
  23. int poolSize = Runtime.getRuntime().availableProcessors() * 2;
  24. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
  25. //核心线程池大小
  26. scheduler.setPoolSize(poolSize);
  27. //线程名字前缀
  28. scheduler.setThreadNamePrefix("taskScheduler-");
  29. //设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
  30. scheduler.setWaitForTasksToCompleteOnShutdown(true);
  31. //设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
  32. scheduler.setAwaitTerminationSeconds(60);
  33. // 线程池满,拒绝策略
  34. scheduler.setRejectedExecutionHandler(rejectedExecutionHandler());
  35. return scheduler;
  36. }
  37. public RejectedExecutionHandler rejectedExecutionHandler() {
  38. return (r, executor) -> {
  39. try {
  40. executor.getQueue().put(r);
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. };
  45. }
  46. }