
com.github.anonymousmister.bootfastconfig.config.NativeAsyncTaskExecutePool Maven / Gradle / Ivy
package com.github.anonymousmister.bootfastconfig.config;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
import java.text.MessageFormat;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author admin
* @title: NativeAsyncTaskExecutePool
* @projectName demo
* @description: 线程池配置类
* @date 2019/7/213:35
*/
@Slf4j
@Configuration
public class NativeAsyncTaskExecutePool implements AsyncConfigurer {
@Autowired
private PropertiesNativeAsyncTaskExecutePoolCfig nativeAsyncTaskExecuteCfig;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
executor.setCorePoolSize(nativeAsyncTaskExecuteCfig.getCorePoolSize());
executor.setMaxPoolSize(nativeAsyncTaskExecuteCfig.getMaxPoolSize());
executor.setQueueCapacity(nativeAsyncTaskExecuteCfig.getQueueCapacity());
executor.setKeepAliveSeconds(nativeAsyncTaskExecuteCfig.getKeepAliveSeconds());
executor.setThreadNamePrefix(nativeAsyncTaskExecuteCfig.getThreadNamePrefix());
// setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
// CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (arg0, arg1, arg2) -> {
log.error("==========================" + arg0.getMessage() + "=======================", arg0);
log.error("exception method:" + arg1.getName());
};
}
public class VisiableThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
private final Logger logger = LoggerFactory.getLogger(VisiableThreadPoolTaskExecutor.class);
private void showThreadPoolInfo(String prefix) {
ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();
if (null == threadPoolExecutor) {
return;
}
logger.info(MessageFormat.format("{0}, {1},taskCount [{2}], completedTaskCount [{3}], activeCount [{4}], queueSize [{5}]",
this.getThreadNamePrefix(),
prefix,
threadPoolExecutor.getTaskCount(),
threadPoolExecutor.getCompletedTaskCount(),
threadPoolExecutor.getActiveCount(),
threadPoolExecutor.getQueue().size()));
}
@Override
public void execute(Runnable task) {
showThreadPoolInfo("1. do execute");
super.execute(task);
}
@Override
public void execute(Runnable task, long startTimeout) {
showThreadPoolInfo("2. do execute");
super.execute(task, startTimeout);
}
@Override
public Future> submit(Runnable task) {
showThreadPoolInfo("1. do submit");
return super.submit(task);
}
@Override
public Future submit(Callable task) {
showThreadPoolInfo("2. do submit");
return super.submit(task);
}
@Override
public ListenableFuture> submitListenable(Runnable task) {
showThreadPoolInfo("1. do submitListenable");
return super.submitListenable(task);
}
@Override
public ListenableFuture submitListenable(Callable task) {
showThreadPoolInfo("2. do submitListenable");
return super.submitListenable(task);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy