package com.brucezee.jspider.scheduler;
import com.brucezee.jspider.scheduler.handler.HashSetRepeatHandler;
import com.brucezee.jspider.Request;
import com.brucezee.jspider.Task;
import com.brucezee.jspider.monitor.SchedulerMonitor;
import com.brucezee.jspider.scheduler.handler.RepeatHandler;
import com.brucezee.jspider.paging.PagingRequestFactory;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 内存无界队列请求任务调度器,同时实现任务队列监控
* Created by brucezee on 2017/1/5.
*/
public class QueueScheduler extends NoRepeatScheduler implements SchedulerMonitor {
private BlockingQueue<Request> queue = new LinkedBlockingQueue<Request>(); //队列
private AtomicInteger count = new AtomicInteger(0); //用于监控的计数器
public QueueScheduler() {
this(null, null);
}
/**
* 构造方法
* @param repeatHandler 请求任务去重
*/
public QueueScheduler(RepeatHandler repeatHandler) {
this(repeatHandler, null);
}
/**
* 构造方法
* @param pagingRequestFactory 分页请求任务生成器
*/
public QueueScheduler(PagingRequestFactory pagingRequestFactory) {
this(null, pagingRequestFactory);
}
/**
* 构造方法
* @param repeatHandler 请求任务去重
* @param pagingRequestFactory 分页请求任务生成器
*/
public QueueScheduler(RepeatHandler repeatHandler, PagingRequestFactory pagingRequestFactory) {
super(repeatHandler != null ? repeatHandler : new HashSetRepeatHandler(), pagingRequestFactory);
}
@Override
public void pushWhenNoRepeat(Task task, Request request) {
queue.add(request);
count.incrementAndGet();
}
@Override
public Request doPoll(Task task) {
return queue.poll();
}
@Override
public int getTotalCount(Task task) {
return count.get();
}
@Override
public int getLeftCount(Task task) {
return queue.size();
}
}