1.线程池配置文件(依个人、环境而定)
package com.rk.iam.sys.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author wdy
* @version 1.0
* @date 2022/3/3 10:51
*/
@Configuration
public class ThreadPoolConfig {
//参数初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
//核心线程数量大小
private static final int corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4));
//线程池最大容纳线程数
private static final int maxPoolSize = CPU_COUNT * 2 + 1;
//阻塞队列
private static final int workQueue = 20;
//线程空闲后的存活时长
private static final int keepAliveTime = 30;
@Bean("asyncTaskExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
//等待队列
threadPoolTaskExecutor.setQueueCapacity(workQueue);
//线程前缀
threadPoolTaskExecutor.setThreadNamePrefix("taskExecutor-");
//线程池维护线程所允许的空闲时间,单位为秒
threadPoolTaskExecutor.setKeepAliveSeconds(keepAliveTime);
// 线程池对拒绝任务(无线程可用)的处理策略
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
2.
注意@Bean的参数asyncTaskExecutor,下面会用到。
2.CompletableFuture(就相当于一个Service一样)
package com.rk.iam.sys.service;
import com.alibaba.fastjson.JSONObject;
import com.rk.iam.idp.entity.GitQuerycapComIdpSrvIdpPkgAccountmgrAccountWithAccountIdentities;
import com.rk.iam.idp.entity.GitQuerycapComIdpSrvIdpPkgAccountmgrAccountWithAccountIdentitySetDataList;
import com.rk.iam.idp.entity.GitQuerycapComIdpSrvIdpPkgAccountmgrUserAccountIDWithPassword;
import com.rk.iam.idp.entity.Param_listAccount;
import com.rk.iam.idp.feign.AccountFeignClient;
import com.rk.iam.sys.common.enums.StatusEnums;
import com.rk.iam.sys.common.vo.SysUserVO;
import com.rk.iam.sys.config.SysConfigurationProperties;
import com.rk.iam.sys.entity.SysConsumer;
import com.rk.iam.sys.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
/**
* @author wdy
* @version 1.0
* @date 2022/3/3 10:53
*/
@Component
@Slf4j
public class AsyncTask {
@Autowired
private SysConsumerService sysConsumerService;
@Autowired
private AccountFeignClient accountFeignClient;
@Autowired
private SysConfigurationProperties sysConfigurationProperties;
@Autowired
private SysUserService sysUserService;
@Autowired
private Executor asyncTaskExecutor; //注入线程池的bean
public CompletableFuture<String> BatchRegIdp(List<SysUserVO> list, Long cid) {
return CompletableFuture.supplyAsync(() -> {
//具体要执行的逻辑
try {
for (SysUserVO sysUserVO : list) {
SysUser sysUser1 = sysUserService.convertToEntity(sysUserVO);
try {
SysUser sysUser = registerIDP(sysUser1, cid);
if (sysUser == null) {
continue;
}
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
e.printStackTrace();
}
return "注册idp用户成功";
}, asyncTaskExecutor); //这个参数就是上面提到的线程池的bean
}
public SysUser registerIDP(SysUser sysUser, Long cid) {
if (StringUtils.isBlank(sysUser.getIdpId())) {
SysConsumer consumer = sysConsumerService.getById(cid);
//当前客户开启同步IDP用户功能
if (StatusEnums.Status.VALID.getCode() == consumer.getIsidp()) {
Param_listAccount param = new Param_listAccount();
param.setIdentity(Arrays.asList(sysUser.getLoginName()));
param.setAccountType(Arrays.asList("USER"));
param.setIdentityType(Arrays.asList("MOBILE"));
GitQuerycapComIdpSrvIdpPkgAccountmgrAccountWithAccountIdentitySetDataList userList = accountFeignClient.listAccount(sysConfigurationProperties.getIdp().getToken(), param);
if (userList.getTotal() == 0) {
JSONObject obj = new JSONObject();
obj.put("mobile", sysUser.getLoginName());
obj.put("nickname", sysUser.getUserName());
GitQuerycapComIdpSrvIdpPkgAccountmgrUserAccountIDWithPassword user = accountFeignClient.createUser(sysConfigurationProperties.getIdp().getToken(), obj);
sysUser.setIdpId(user.getAccountID());
} else {
List<GitQuerycapComIdpSrvIdpPkgAccountmgrAccountWithAccountIdentities> data = userList.getData();
for (GitQuerycapComIdpSrvIdpPkgAccountmgrAccountWithAccountIdentities datum : data) {
sysUser.setIdpId(datum.getAccountID());
}
}
}
}
return sysUser;
}
}