package com.zte.ws.service.common;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ManagerMonitorThreadPoolService {
private static final int CPU_CORES = Runtime.getRuntime().availableProcessors();
private static final int DEFAULT_CORE_SIZE = Math.max(2, Math.min(CPU_CORES, 16));
private static final int MAX_CORE_SIZE = Math.min(CPU_CORES*3, 40);
private static final int QUEUE_SIZE = 200;
private ManagerMonitorThreadPoolService() {
}
/**
* 获取单例线程池对象
*
* @return
*/
private static volatile ThreadPoolExecutor executor;
public static ThreadPoolExecutor getInstance() {
if (executor == null) {
initInstance();
}
return executor;
}
private static synchronized void initInstance()
{
if (executor == null){
executor = new ThreadPoolExecutor(
DEFAULT_CORE_SIZE, //核心线程数
MAX_CORE_SIZE, //最大线程数
1L, //闲置线程存活时间
TimeUnit.MINUTES, //时间单位
new LinkedBlockingDeque<Runnable>(QUEUE_SIZE) //线程队列
);
}
}
}
@Override
public Map<String, BaseResult> checkPingForWeb(List<GdbManagerCheckPingDto> dtos) {
log.debug("checkPingForWeb start");
// 这里只处理rdb的条件校验
validateRdbBatchWithException(dtos);
Map<String, BaseResult> resultMap = new ConcurrentHashMap<>();
StringBuffer errorResults = new StringBuffer();
if (CollectionUtils.isEmpty(dtos)) {
return resultMap;
}
// 使用单例线程池替代原来的FixedThreadPool
ThreadPoolExecutor executor = ManagerCheckPingThreadPoolService.getInstance();
try {
executeCheckPingTasks(dtos, resultMap, errorResults, executor);
} catch (Exception e) {
log.error("checkPingForWeb Exception occurred", e);
String errorMessage = e.getCause() != null ? e.getCause().getMessage() : e.getMessage();
appendSystemError(errorResults, errorMessage);
}
finally {
log.debug("checkPingForWeb,ThreadPool final state - Active threads: {}, Pool size: {}, Core pool size: {}, Max pool size: {}",
executor.getActiveCount(), executor.getPoolSize(), executor.getCorePoolSize(), executor.getMaximumPoolSize());
// if (executor != null && !executor.isShutdown()) {
// executor.shutdownNow();
// }
}
if (StringUtils.isNotBlank(errorResults.toString())) {
throw new DBaaSBusinessException(errorResults.toString());
}
log.debug("checkPingForWeb end");
return resultMap;
}