FileCacheQueueScheduler 调用 pushWhenNoDuplicate() 时报 NullPointerException 异常
Closed this issue · 2 comments
brianway commented
代码比较简单,就是设置了一下各个部件,对应文件夹 /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()
,queue
在 readFile()
里初始化的。init
没执行,所以空指针了。
brianway commented
我又试了下,是布隆过滤器的问题。好像 FileCacheQueueScheduler 和布隆过滤器不协同。我去掉 setDuplicateRemover(new BloomFilterDuplicateRemover(crawlSize))
后使用默认的 HashSetDuplicateRemover
就能工作了。
但我想同时使用 FileCacheQueueScheduler 和 BloomFilterDuplicateRemover 这两者,该怎么办?
code4craft commented
这里是处理的有问题,init放到自带的DuplicateRemover里去了。
先临时修复了下,提交到了master分支。
这个类初始化的方式不太优雅,后面会考虑更好的方式。