ThreadPoolConfig.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.smppw.modaq.infrastructure.config;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.slf4j.MDC;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.core.task.TaskDecorator;
  8. import org.springframework.scheduling.annotation.EnableAsync;
  9. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  10. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  11. import java.util.Map;
  12. import java.util.concurrent.ThreadPoolExecutor;
  13. @Configuration
  14. @EnableAsync
  15. public class ThreadPoolConfig {
  16. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  17. @Bean("asyncExecutor")
  18. public ThreadPoolTaskExecutor asyncExecutor() {
  19. ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
  20. taskExecutor.setCorePoolSize(5);
  21. taskExecutor.setMaxPoolSize(5);
  22. taskExecutor.setQueueCapacity(50);
  23. taskExecutor.setKeepAliveSeconds(60);
  24. taskExecutor.setThreadNamePrefix("asyncExecutor--");
  25. taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
  26. taskExecutor.setAwaitTerminationSeconds(60);
  27. taskExecutor.setTaskDecorator(new MdcTaskDecorator());
  28. // 修改拒绝策略为使用当前线程执行
  29. taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  30. // 初始化线程池
  31. taskExecutor.initialize();
  32. return taskExecutor;
  33. }
  34. @Bean(name = "parseTaskScheduler")
  35. public ThreadPoolTaskScheduler taskScheduler() {
  36. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
  37. // 核心配置参数
  38. scheduler.setPoolSize(5); // 线程池大小
  39. scheduler.setThreadNamePrefix("parse-scheduler-"); // 线程名前缀
  40. scheduler.setAwaitTerminationSeconds(60); // 关闭时等待任务完成的时间
  41. scheduler.setWaitForTasksToCompleteOnShutdown(true); // 关闭时等待任务完成
  42. scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略
  43. scheduler.setTaskDecorator(new MdcTaskDecorator());
  44. // 可选配置
  45. scheduler.setErrorHandler(t -> {
  46. this.logger.error("定时任务执行异常: {}", t.getMessage());
  47. // 这里可以添加自定义错误处理逻辑
  48. });
  49. scheduler.setRemoveOnCancelPolicy(true); // 取消后立即移除任务
  50. scheduler.initialize(); // 初始化线程池
  51. return scheduler;
  52. }
  53. static class MdcTaskDecorator implements TaskDecorator {
  54. @Override
  55. public Runnable decorate(Runnable runnable) {
  56. Map<String, String> contextMap = MDC.getCopyOfContextMap();
  57. return () -> {
  58. try {
  59. MDC.setContextMap(contextMap);
  60. runnable.run();
  61. } finally {
  62. MDC.clear();
  63. }
  64. };
  65. }
  66. }
  67. }