一:实现
package com.welab.cycfc2.job.loan;
import com.dangdang.ddframe.job.api.JobExecutionMultipleShardingContext;
import com.dangdang.ddframe.job.plugin.job.type.simple.AbstractSimpleElasticJob;
import com.welab.cycfc2.enums.welab.LoanTaskTypeEnum;
import com.welab.cycfc2.enums.welab.TaskStatusEnum;
import com.welab.cycfc2.model.entity.LoanTask;
import com.welab.cycfc2.model.entity.LoanTaskDetail;
import com.welab.cycfc2.service.LoanService;
import com.welab.cycfc2.service.LoanTaskDetailService;
import com.welab.cycfc2.service.LoanTaskService;
import com.welab.util.UUIDShort;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 放款任务执行job
*
* @author lizhangyu
*/
@Slf4j
@Component
public class LoanTaskGeneralJob extends AbstractSimpleElasticJob {
@Autowired
private LoanTaskService loanTaskService;
@Autowired
private LoanService loanService;
@Autowired
private LoanTaskDetailService loanTaskDetailService;
private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(5);
@Override
public void process(JobExecutionMultipleShardingContext params) {
log.info("开始执行放款任务");
List<LoanTask> loanTasks = loanTaskService.queryLoanTaskByStatus(TaskStatusEnum.NONE.getValue());
if(CollectionUtils.isEmpty(loanTasks)){
log.info("待处理放款任务数量为零");
return;
}
log.info("待处理记录数:[{}]", loanTasks.size());
StopWatch watch = new StopWatch();
watch.start();
CountDownLatch latch = new CountDownLatch(loanTasks.size());
loanTasks.forEach(task -> {
EXECUTOR.submit(() -> {
try {
Thread.currentThread().setName("LoanTaskGeneralJob-" + LoanTaskTypeEnum.getValueByStep(task.getCurrStep()) + "-" + UUIDShort.generate());
log.info("贷款号:{},步骤:{}", task.getApplicationId(), task.getCurrStep());
LoanTaskDetail loanTaskDetail = loanTaskDetailService.queryDetailByAppIdAndStep(task.getApplicationId(), task.getCurrStep());
loanService.loanTaskExecute(loanTaskDetail);
} finally {
latch.countDown();
}
});
});
try {
latch.await();
} catch (InterruptedException e) {
log.error("放款任务运行异常|{}", e.getMessage(), e);
}
watch.stop();
log.info("放款任务执行完成,处理记录数:{},耗时:{}ms",loanTasks.size(), watch.getTotalTimeMillis());
}
}
只是个模板类。