package com.jackson.task.queue; import com.jackson.bean.Bundle; import com.jackson.db.po.Proxy; import java.util.ArrayList; import java.util.HashMap; /** * Created by Jackson on 2017/2/9. * 串行任务,通过任务的返回值 TaskProcess 来决定任务的执行和取消 * */ public class QueueTaskCollection { private ArrayList<RequestQueueTask> taskList; private Bundle bundle; private int currentTaskPosition; private CollectionState state = CollectionState.CAN_TAKE; private Proxy proxy; public Proxy getProxy() { return proxy; } public void setProxy(Proxy proxy) { this.proxy = proxy; } public static QueueTaskCollection newInstance(Bundle bundle) { return new QueueTaskCollection(bundle); } private QueueTaskCollection(Bundle bundle) { taskList = new ArrayList<>(); if (bundle != null) { this.bundle = bundle; } else { this.bundle = Bundle.newInstance(); } } public void addLast(RequestQueueTask task) { task.setBundle(bundle); task.setCollection(this); taskList.add(task); } public synchronized RequestQueueTask getTask() { if (state == CollectionState.CANT_TAKE) return null; if (currentTaskPosition < taskList.size()) { RequestQueueTask queueTask = taskList.get(currentTaskPosition); if (currentTaskPosition == taskList.size() - 1) {//取到最后一个时 state = CollectionState.COMPLETE; } else { state = CollectionState.CANT_TAKE; } return queueTask; } else { return null; } } public synchronized void onProcess(TaskProcess taskProcess) { if (state == CollectionState.COMPLETE) { if (taskProcess == TaskProcess.NEXT || taskProcess == TaskProcess.END) return; } switch (taskProcess) { case AGAIN: state = CollectionState.CAN_TAKE; break; case NEXT: currentTaskPosition++; state = CollectionState.CAN_TAKE; break; case END: currentTaskPosition = taskList.size(); state = CollectionState.COMPLETE; break; case ALL_AGAIN: currentTaskPosition = 0; state = CollectionState.CAN_TAKE; break; } } public synchronized CollectionState getState() { return state; } public enum TaskProcess { /** * 再做一次本任务 */ AGAIN, /** * 下一个任务 */ NEXT, /** * 结束所有任务 */ END, /** * 所有任务重来 */ ALL_AGAIN } public enum CollectionState { CAN_TAKE, CANT_TAKE, COMPLETE } }