1、线程的参数配置:
/**
* 手动定义线程池参数,避免出现OOM
* 采用的是无界队列(当任务数大于核心线程数,多余的任务在队列排队
* 直到有空闲的线程才去处理)
* @author xpzhang
*
*/
public class CommonThreadPool {
// 核心线程池
private static final int CORE_POOL_SIZE = 10;
// 线程活跃时间
private static final int KEEP_ALIVE_TIME = 60;
private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
CORE_POOL_SIZE,
Integer.MAX_VALUE,
KEEP_ALIVE_TIME, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(),
new ThreadPoolExecutor.AbortPolicy());
public static ThreadPoolExecutor getExecutor() {
return EXECUTOR;
}
}
2、项目运用:
/**
* 定时任务向第三方平台发送逾期事件
* @param list
*/
public void sendOverdueEvent(List<RefundView> list){
ThreadPoolExecutor threadPoolExecutor = CommonThreadPool.getExecutor();
for (RefundView vo : list) {
//开启异步线程推送数据
threadPoolExecutor.execute(()->{
//只有符合平台条件才推送数据
if(assetsPlatformService.checkProject(vo.getProductId(),PU_HUO_DAI)){
EventDTO assetsReq = new EventDTO();
assetsReq.setEventType(EventType.FINANCING_ORDER_FINANCING_OVERDUE);
assetsReq.setName(EventType.FINANCING_ORDER_FINANCING_OVERDUE.getValue());
assetsReq.setEventDate(LocalDateTimeUtils.getLocalDateTimeFromDate(vo.getOverdueDate()));
assetsReq.setSponsor(vo.getLoanee());
assetsReq.setResult("成功");
assetsReq.setOriginalId(vo.getWithdrawalCode());
assetsReq.setSource(AppConstants.ASSETS_LOAN_SOURCE);
try {
boolean reqStatus = assetsService.sendWithDrawlData(vo.getWithdrawalCode(), assetsReq);
if(reqStatus){//请求成功,调用第三方更新接口
FinancingOrderDTO financingOrderDTO = packageUpdateEvenData(vo);
assetsService.sendUpdateEventData(financingOrderDTO);
}
} catch (Exception e) {
log.error("向第三方平台推送逾期数据异常,推送编号:getWithdrawalCode:{}",vo.getWithdrawalCode());
}
}
});
}
}
3、基于spring的线程池,可携带参数
/**
* 继承父线程http请求上下文
* @author xpzhang
*
*/
public class ContextThreadPool {
private static final int CORE_POOL_SIZE = 10;
private static final int MAX_POOL_SIZE = 20;
private static final int QUEUE_CAPACITY = 1024;
private static final int KEEP_ALIVE_TIME = 60;
private static final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
static {
executor.setCorePoolSize(CORE_POOL_SIZE);
executor.setMaxPoolSize(MAX_POOL_SIZE);
executor.setKeepAliveSeconds(KEEP_ALIVE_TIME);
executor.setQueueCapacity(QUEUE_CAPACITY);
executor.setThreadFactory(new DefaultThreadFactory("context-pool", false));
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.setTaskDecorator(runnable -> {
try {
RequestAttributes attributes = RequestContextHolder.currentRequestAttributes();
return () -> {
try {
RequestContextHolder.setRequestAttributes(attributes);
runnable.run();
} finally {
RequestContextHolder.resetRequestAttributes();
}
};
} catch (IllegalStateException e) {
return runnable;
}
});
executor.initialize();
}
public static ThreadPoolTaskExecutor getExecutor() {
return executor;
}
}