View Javadoc
1   package us.codecraft.webmagic.scheduler;
2   
3   import us.codecraft.webmagic.Request;
4   import us.codecraft.webmagic.Task;
5   import us.codecraft.webmagic.utils.NumberUtils;
6   
7   import java.util.Comparator;
8   import java.util.concurrent.BlockingQueue;
9   import java.util.concurrent.LinkedBlockingQueue;
10  import java.util.concurrent.PriorityBlockingQueue;
11  
12  /**
13   * Priority scheduler. Request with higher priority will poll earlier. <br>
14   *
15   * @author code4crafter@gmail.com <br>
16   * @since 0.2.1
17   */
18  public class PriorityScheduler extends DuplicateRemovedScheduler implements MonitorableScheduler {
19  
20      public static final int INITIAL_CAPACITY = 5;
21  
22      private BlockingQueue<Request> noPriorityQueue = new LinkedBlockingQueue<Request>();
23  
24      private PriorityBlockingQueue<Request> priorityQueuePlus = new PriorityBlockingQueue<Request>(INITIAL_CAPACITY, new Comparator<Request>() {
25          @Override
26          public int compare(Request o1, Request o2) {
27              return -NumberUtils.compareLong(o1.getPriority(), o2.getPriority());
28          }
29      });
30  
31      private PriorityBlockingQueue<Request> priorityQueueMinus = new PriorityBlockingQueue<Request>(INITIAL_CAPACITY, new Comparator<Request>() {
32          @Override
33          public int compare(Request o1, Request o2) {
34              return -NumberUtils.compareLong(o1.getPriority(), o2.getPriority());
35          }
36      });
37  
38      @Override
39      public void pushWhenNoDuplicate(Request request, Task task) {
40          if (request.getPriority() == 0) {
41              noPriorityQueue.add(request);
42          } else if (request.getPriority() > 0) {
43              priorityQueuePlus.put(request);
44          } else {
45              priorityQueueMinus.put(request);
46          }
47      }
48  
49      @Override
50      public synchronized Request poll(Task task) {
51          Request poll = priorityQueuePlus.poll();
52          if (poll != null) {
53              return poll;
54          }
55          poll = noPriorityQueue.poll();
56          if (poll != null) {
57              return poll;
58          }
59          return priorityQueueMinus.poll();
60      }
61  
62      @Override
63      public int getLeftRequestsCount(Task task) {
64          return noPriorityQueue.size();
65      }
66  
67      @Override
68      public int getTotalRequestsCount(Task task) {
69          return getDuplicateRemover().getTotalRequestsCount(task);
70      }
71  }