code4craft/webmagic

FileCacheQueueScheduler 调用 pushWhenNoDuplicate() 时报 NullPointerException 异常

Closed this issue · 2 comments

代码比较简单,就是设置了一下各个部件,对应文件夹 /Users/brian/todo/data/webmagic 已创建好,代码如下:

public static void main(String[] args) {
        String pipelinePath = "/Users/brian/todo/data/webmagic";
        int crawlSize = 1000000;
        Spider.create(new ZhihuUserPageProcessor())
                .setScheduler(new FileCacheQueueScheduler(pipelinePath)
                        .setDuplicateRemover(new BloomFilterDuplicateRemover(crawlSize)))
                .addPipeline(new FilePipeline(pipelinePath))
                .addUrl(generateMemberUrl("hydro-ding"))
                .thread(1)
                .run();
    }

然而报空指针异常:

Exception in thread "main" java.lang.NullPointerException
	at us.codecraft.webmagic.scheduler.FileCacheQueueScheduler.pushWhenNoDuplicate(FileCacheQueueScheduler.java:182)
	at us.codecraft.webmagic.scheduler.DuplicateRemovedScheduler.push(DuplicateRemovedScheduler.java:36)
	at us.codecraft.webmagic.Spider.addRequest(Spider.java:453)
	at us.codecraft.webmagic.Spider.addUrl(Spider.java:476)

我单步进去,发现 FileCacheQueueScheduler 类的第 182 行报错,queue 没有被初始化。

protected void pushWhenNoDuplicate(Request request, Task task) {
        queue.add(request);
        fileUrlWriter.println(request.getUrl());
    }

打断点发现前面的初始化方法 private void init(Task task) 并没有被执行,init(Task task) 调用readFile()queuereadFile() 里初始化的。init 没执行,所以空指针了。

我又试了下,是布隆过滤器的问题。好像 FileCacheQueueScheduler 和布隆过滤器不协同。我去掉 setDuplicateRemover(new BloomFilterDuplicateRemover(crawlSize)) 后使用默认的 HashSetDuplicateRemover 就能工作了。

但我想同时使用 FileCacheQueueScheduler 和 BloomFilterDuplicateRemover 这两者,该怎么办?

这里是处理的有问题,init放到自带的DuplicateRemover里去了。
先临时修复了下,提交到了master分支。
这个类初始化的方式不太优雅,后面会考虑更好的方式。