调度器分为正常调度,异常调度,异常调度根据不同的队列进行时间间隔的区分,采用ScheduledExecutorService进行时间间隔调度,调度时根据当前队列中addData进队列里的数据分配线程进行处理。先看正常调度,这个类在构造函数时就会被调度,可以添加set方法,配置好单独再进行scheduler:
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 异步任务定时执行管理
*/
public abstract class AbstractScheduleTask<T> implements ScheduleTask<T> {
/** 任务队列 */
protected final BlockingQueue<T> dataQueue;
/** 线程池 */
protected final ExecutorService executorService;
/** 调度任务 */
protected final ScheduledExecutorService scheduledExecutorService;
/** 定时任务数 */
private int scheduleSize = 1;
/** 定时任务开始执行时间 */
private int scheduleInitialDelay = 0;
/** 定时任务间隔时间,正常单条数据的插入时间<3ms,队列的长度为1000,1000m秒的时间足够,避免队列的数据堆积 */
private int scheduleDelay = 1000;
/** 线程池大小 */
private int threadPoolSize = 8;
/** 队列大小 */
private int queueSize = 2000;
/** 线程批处理大小; */
private int dataSize = 100;
/** 默认构造方法,加载定时任务 */
public AbstractScheduleTask() {
dataQueue = new LinkedBlockingQueue<T>(queueSize);
executorService = Executors.newFixedThreadPool(threadPoolSize);
scheduledExecutorService = Executors.newScheduledThreadPool(scheduleSize);
schedule();
}
/**
* 具体业务数据处理
*
* @param data
* @return
*/
protected abstract Integer doData(final List<T> data);
/**
* 添加数据到队列
*/
@Override
public void addData(T parameterObject) {
if (parameterObject != null) {
if (dataQueue.size() >= this.getQueueSize()) {
// 消费队列数据过大
}
try {
dataQueue.put(parameterObject);
} catch (InterruptedException e) {
// 添加队列数据异常
}
}
}
/**
* 设置定时任务 设定执行线程计划,初始10s延迟,每次任务完成后延迟10s再执行一次任务
*/
private void schedule() {
for (int i = 0; i < scheduleSize; i++) {
scheduledExecutorService.scheduleWithFixedDelay(new ScheduleHandler(), scheduleInitialDelay, scheduleDelay,
TimeUnit.MILLISECONDS);
}
}
/**
* 创建任务
*
* @param data
*