示例二:线程池集成
NitExecutorConfig.java
package cn.cuiot.municipal.gather.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
@Slf4j
public class NitExecutorConfig {
private int corePoolSize = 100;
private int maxPoolSize = 100;
private int queueCapacity = 100;
private String namePrefix = "NIT---";
@Bean
public Executor asyncNitServiceExecutor() {
log.debug("asyncNitServiceExecutor.init");
ThreadPoolTaskExecutor executor = new NitThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(namePrefix);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.initialize();
return executor;
}
}
NitThreadPoolTaskExecutor执行器
package cn.cuiot.municipal.gather.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
@Slf4j
public class NitThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
private static final long serialVersionUID = 1022908077279022770L;
private void logThreadPoolStatus() {
ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();
if (null == threadPoolExecutor) {
return;
}
log.info("{}, {},taskCount [{}], completedTaskCount [{}], activeCount [{}], queueSize [{}]",
this.getThreadNamePrefix(), threadPoolExecutor.getTaskCount(),
threadPoolExecutor.getCompletedTaskCount(), threadPoolExecutor.getActiveCount(),
threadPoolExecutor.getQueue().size());
log.info("核心线程数:{}, 最大线程数:{}, 当前线程数: {}, 活跃的线程数: {}", getCorePoolSize(), getMaxPoolSize(), getPoolSize(),
getActiveCount());
}
@Override
public void execute(Runnable task) {
logThreadPoolStatus();
super.execute(task);
}
@Override
public Future<?> submit(Runnable task) {
logThreadPoolStatus();
return super.submit(task);
}
@Override
public <T> Future<T> submit(Callable<T> task) {
logThreadPoolStatus();
return super.submit(task);
}
@Override
public ListenableFuture<?> submitListenable(Runnable task) {
logThreadPoolStatus();
return super.submitListenable(task);
}
@Override
public <T> ListenableFuture<T> submitListenable(Callable<T> task) {
logThreadPoolStatus();
return super.submitListenable(task);
}
}
使用示例
@Autowired
private Executor asyncNitExecutor;
asyncNitExecutor.execute(() -> {
GewuApiLogEntiy gewuApiLogEntiy = GewuApiLogEntiy.builder()
.apiName("控制api")
.apiRequest(request.toJSONString())
.apiResponse(body.toString())
.apiType(1)
.transId(request.getString("trans_id"))
.resultCode("")
.build();
gewuApiLogService.save(gewuApiLogEntiy);
});