//第一步.业务方法自己实现 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