多线程的执行job
// 1.查询总条数
@Override
public R initOrdinaryMerc() {
int count = crmOrdinaryMercMapper.selectRenewMercCount();
int maxPage = (count % pageSize == 0) ? (count / pageSize) : (count / pageSize + 1);
log.info("总共{}条续费商户数据", count);
// 避免再job中查询太过频繁,查询出需要的user信息然后存进redis中
SysUser user = new SysUser();
user.setDutys(DutyEnum.BIGCUSTOMER.getValue() + "," + DutyEnum.PHONECUSTOMER.getValue());
List<SysUser> userList = remoteUserService.findListByUser(user);
userList.forEach(u -> {
redisUtils.set(coustomerKey + u.getUserId(), u, 3600);
});
doPageRenewal(1, maxPage);
log.info("商户中心续费数更新完成");
return R.ok();
}
// 2.引入一个固定线程池数量的线程池执行器
private ExecutorService executorservice = Executors.newFixedThreadPool(4);
// 3.循环递归的进行调用使用分页的方法查询数据,多线程执行
private void doPageRenewal(int pageIndex, int maxPage) {
String operationName = ServletUtils.getHeader(Constants.CURRENT_LOGINNAME);
log.info("执行页码" + pageIndex);
PageHelper.startPage(pageIndex, pageSize);
if (pageIndex > maxPage) {
return;
}
List<CrmOrdinaryMerc> list = crmOrdinaryMercMapper.selectRenewMercList();
if (CollectionUtils.isEmpty(list)) {
return;
}
for (CrmOrdinaryMerc merc : list) {
try {
if (ObjectUtil.isNotNull(merc)){
executorservice.submit(new OrdinaryMercRunnable(merc, operationName));
}
} catch (Exception e) {
log.info("", e);
}
}
pageIndex += 1;
doPageRenewal(pageIndex, maxPage);
}
// 4.执行器执行
/**
* 执行器
*/
public class OrdinaryMercRunnable implements Runnable {
CrmOrdinaryMerc crmOrdinaryMerc;
private String operationName;
// 构造方法
public OrdinaryMercRunnable(CrmOrdinaryMerc crmOrdinaryMerc, String operationName) {
this.crmOrdinaryMerc = crmOrdinaryMerc;
this.operationName = operationName;
}
@Override
public void run() {
try {
execute(crmOrdinaryMerc, operationName);
} catch (Exception e) {
log.info("执行失败", e);
}
}
}
// 具体的实现业务逻辑
private void execute(CrmOrdinaryMerc ordinaryMerc, String operationName) {
// 业务逻辑
}