Commit 2bb6f847 authored by yihua.huang's avatar yihua.huang

fix redis null pointer exception

parent 2c97dd90
...@@ -7,9 +7,6 @@ import us.codecraft.webmagic.Request; ...@@ -7,9 +7,6 @@ import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Task; import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.schedular.Scheduler; import us.codecraft.webmagic.schedular.Scheduler;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* 使用redis管理url,构建一个分布式的爬虫。<br> * 使用redis管理url,构建一个分布式的爬虫。<br>
* *
...@@ -25,10 +22,6 @@ public class RedisScheduler implements Scheduler { ...@@ -25,10 +22,6 @@ public class RedisScheduler implements Scheduler {
private static final String SET_PREFIX = "set_"; private static final String SET_PREFIX = "set_";
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public RedisScheduler(String host) { public RedisScheduler(String host) {
pool = new JedisPool(new JedisPoolConfig(), host); pool = new JedisPool(new JedisPoolConfig(), host);
} }
...@@ -38,15 +31,9 @@ public class RedisScheduler implements Scheduler { ...@@ -38,15 +31,9 @@ public class RedisScheduler implements Scheduler {
Jedis jedis = pool.getResource(); Jedis jedis = pool.getResource();
//使用SortedSet进行url去重 //使用SortedSet进行url去重
if (jedis.zrank(SET_PREFIX + task.getUUID(), request.getUrl()) == null) { if (jedis.zrank(SET_PREFIX + task.getUUID(), request.getUrl()) == null) {
try {
lock.lock();
//使用List保存队列 //使用List保存队列
jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl());
jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl()); jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl());
condition.signal();
} finally {
lock.unlock();
}
} }
pool.returnResource(jedis); pool.returnResource(jedis);
} }
...@@ -55,21 +42,10 @@ public class RedisScheduler implements Scheduler { ...@@ -55,21 +42,10 @@ public class RedisScheduler implements Scheduler {
public synchronized Request poll(Task task) { public synchronized Request poll(Task task) {
Jedis jedis = pool.getResource(); Jedis jedis = pool.getResource();
String url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); String url = jedis.lpop(QUEUE_PREFIX + task.getUUID());
if (url == null) {
try {
lock.lock();
while (url == null) {
try {
condition.await();
url = jedis.lpop(QUEUE_PREFIX + task.getUUID());
} catch (InterruptedException e) {
}
}
} finally {
lock.unlock();
}
}
pool.returnResource(jedis); pool.returnResource(jedis);
if (url==null){
return null;
}
return new Request(url); return new Request(url);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment