diff --git a/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java new file mode 100644 index 0000000..10a93a9 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java @@ -0,0 +1,56 @@ +package com.iformall.config; + + +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Method; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Component +public class AsyncConfig implements AsyncConfigurer { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Value("${thread.pool.corePoolSize:10}") + private int corePoolSize; + + @Value("${thread.pool.maxPoolSize:20}") + private int maxPoolSize; + + @Value("${thread.pool.keepAliveSeconds:4}") + private int keepAliveSeconds; + + @Value("${thread.pool.queueCapacity:512}") + private int queueCapacity; + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setKeepAliveSeconds(keepAliveSeconds); + executor.setQueueCapacity(queueCapacity); + executor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor exe) -> { + logger.warn("当前任务线程池队列已满."); + }); + executor.initialize(); + return executor; + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new AsyncUncaughtExceptionHandler() { + @Override + public void handleUncaughtException(Throwable ex, Method method, Object... params) { + logger.error("线程池执行任务发生未知异常.", ex); + } + }; + } +}