地质所 沉降监测网建设项目
chenhuan
2024-05-16 0fdd42e318f51f9e3c6581473416af1cca69877f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.javaweb.spider.scheduler;
 
import com.javaweb.spider.domain.ExitWayEnum;
import com.javaweb.spider.domain.SpiderConfig;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.scheduler.DuplicateRemovedScheduler;
import us.codecraft.webmagic.scheduler.MonitorableScheduler;
 
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
 
/**
 * 自定义的调度器,主要用来处理url限制爬取的条数
 */
public class CountDownScheduler extends DuplicateRemovedScheduler implements MonitorableScheduler {
    private BlockingQueue<Request> queue = new LinkedBlockingQueue<>();
    private int realUrlCount = -1;
 
    public CountDownScheduler(SpiderConfig spiderConfig) {
        if (ExitWayEnum.URL_COUNT.toString().equals(spiderConfig.getExitWay())) {
            // 实际抓取的url数量包括入口页面
            this.realUrlCount = spiderConfig.getCount() + spiderConfig.getEntryUrlsList().size();
        }
    }
 
    @Override
    public void pushWhenNoDuplicate(Request request, Task task) {
        // 当程序退出方式非URL_COUNT时按照正常逻辑处理
        if (realUrlCount == -1) {
            this.queue.add(request);
            return;
        }
        // 在有效期内(realUrlCount > 0),每次push url时realUrlCount - 1, 当 realUrlCount <= 0 时,当前Scheduler将不再收录新的url
        if (realUrlCount <= 0) {
            return;
        }
        realUrlCount--;
        this.queue.add(request);
    }
 
    @Override
    public Request poll(Task task) {
        return (Request) this.queue.poll();
    }
 
    @Override
    public int getLeftRequestsCount(Task task) {
        return this.queue.size();
    }
 
    @Override
    public int getTotalRequestsCount(Task task) {
        return this.getDuplicateRemover().getTotalRequestsCount(task);
    }
}