高并发框架解决批量任务要求执行速度快、可查询进度和与业务解耦

//第一步.业务方法自己实现
public interface ITaskProcess<T,R> {

    TaskResult<R> taskExecute(T data);
}
 

//第二部.编写job,并统计结果便于查询进度
public class JobInfo<R> {
    private String jobName;
    private ITaskProcess<?,?> taskProcess;
    private int jobLenth;
    private AtomicInteger successCount;
    //已执行任务数量
    private AtomicInteger processCount;
    private ITaskProcess iTaskProcess;
    private LinkedBlockingQueue<TaskResult<R>> taskDetailQueue;
    public JobInfo(String jobName, int jobLenth, ITaskProcess<?, ?> taskProcess) {
        this.jobName = jobName;
        this.taskProcess = taskProcess;
        this.jobLenth = jobLenth;
        this.successCount = new AtomicInteger(0);
        this.processCount = new AtomicInteger(0);
        this.taskDetailQueue = new LinkedBlockingQueue<TaskResult<R>>(jobLenth);
    }

    public String getTokenProcess(){
        return successCount.get()+" "+processCount.get() + " " +jobLenth;
    }

    public List<TaskResult<R>> getTaskDetail(){
        List<TaskResult<R>> taskResults = new LinkedList<TaskResult<R>>();
        TaskResult taskResult;
        while ((taskResult = taskDetailQueue.poll()) != null){
            taskResults.add(taskResult);
        }
        return taskResults;
    }

    public void addTaskResult(TaskResult result){
        if(result.getResultType().equals(TaskTypeEnum.SUCESS)){
            successCount.incrementAndGet();
        }
        processCount.incrementAndGet();
        taskDetailQueue.add(result);
    }

    public ITaskProcess getiTaskProcess() {
        return iTaskProcess;
    }

    public void setiTaskProcess(ITaskProcess iTaskProcess) {
        this.iTaskProcess = iTaskProcess;
    }

    public JobInfo(ITaskProcess iTaskProcess) {
        this.iTaskProcess = iTaskProcess;
    }
}
//第三部.编写task
public class MyTask<T,R> implements Runnable {

    private JobInfo<R> jobInfo;

    private T processData;

    public MyTask(JobInfo<R> jobInfo, T processData) {
        this.jobInfo = jobInfo;
        this.processData = processData;
    }

    public void run() {
        ITaskProcess iTaskProcess = jobInfo.getiTaskProcess();
        TaskResult<R> rTaskResult = null;
        try {
            rTaskResult = iTaskProcess.taskExecute(processData);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            jobInfo.addTaskResult(rTaskResult);
        }
    }
}
//第四部.注册job,存放任务task
private ConcurrentHashMap<String, JobInfo> jobInfoMap = new ConcurrentHashMap<String, JobInfo>();

ExecutorService executorService = Executors.newFixedThreadPool(2);

public  void registerJob(String jobName,int jobLenth,ITaskProcess<?,?> iTaskProcess ){
    JobInfo jobInfo = new JobInfo(jobName,jobLenth,iTaskProcess);
    if(jobInfoMap.putIfAbsent(jobName,jobInfo) != null){
        throw new RuntimeException();
    }

}

private <R> JobInfo<R> getJob(String jobName){
    JobInfo jobInfo = (JobInfo)jobInfoMap.get(jobName);
    if(jobInfo == null){

    }
    return jobInfo;
}

public void putTask(String jobName,T t){
    JobInfo jobInfo = getJob(jobName);
    executorService.submit(new MyTask<T,R>(jobInfo,t));
}

//第五部 定时任务清楚ConcurrentHashMap

过期job

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值