package com.brucezee.jspider.redis; import com.brucezee.jspider.Request; import com.brucezee.jspider.Task; import com.brucezee.jspider.monitor.SchedulerMonitor; import com.brucezee.jspider.scheduler.NoRepeatScheduler; import com.brucezee.jspider.scheduler.handler.RepeatHandler; import com.brucezee.jspider.paging.PagingRequestFactory; import com.brucezee.jspider.serializer.RequestJsonSerializer; import com.brucezee.jspider.serializer.Serializer; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * Created by brucezee on 2017/1/7. */ public class RedisScheduler extends NoRepeatScheduler implements SchedulerMonitor { protected JedisPool jedisPool; protected Serializer<Request> serializer; public RedisScheduler(JedisPool jedisPool) { this(jedisPool, new RequestJsonSerializer()); } public RedisScheduler(JedisPool jedisPool, Serializer<Request> serializer) { this(jedisPool, serializer, new RedisRepeatHandler(jedisPool), null); } public RedisScheduler(JedisPool jedisPool, Serializer<Request> serializer, RepeatHandler repeatHandler, PagingRequestFactory pagingRequestFactory) { super(repeatHandler, pagingRequestFactory); this.jedisPool = jedisPool; this.serializer = serializer; } @Override protected void pushWhenNoRepeat(Task task, Request request) { Jedis jedis = jedisPool.getResource(); try { jedis.rpush(RedisKeys.getQueueKey(task), serializer.serialize(request)); } finally { jedis.close(); } } @Override public Request doPoll(Task task) { Jedis jedis = jedisPool.getResource(); try { return serializer.deserialize(jedis.lpop(RedisKeys.getQueueKey(task))); } finally { jedis.close(); } } @Override public int getTotalCount(Task task) { Jedis jedis = jedisPool.getResource(); try { Long size = jedis.scard(RedisKeys.getSetKey(task)); return size.intValue(); } finally { jedis.close(); } } @Override public int getLeftCount(Task task) { Jedis jedis = jedisPool.getResource(); try { Long size = jedis.llen(RedisKeys.getQueueKey(task)); return size.intValue(); } finally { jedis.close(); } } public JedisPool getJedisPool() { return jedisPool; } public void setJedisPool(JedisPool jedisPool) { this.jedisPool = jedisPool; } public Serializer<Request> getSerializer() { return serializer; } public void setSerializer(Serializer<Request> serializer) { this.serializer = serializer; } public static class RedisRepeatHandler implements RepeatHandler { protected JedisPool jedisPool; public RedisRepeatHandler(JedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public boolean isDuplicate(Task task, Request request) { Jedis jedis = jedisPool.getResource(); try { return jedis.sismember(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } @Override public void addRepeatCheck(Task task, Request request) { Jedis jedis = jedisPool.getResource(); try { jedis.sadd(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } @Override public void resetAllRepeatCheck(Task task) { Jedis jedis = jedisPool.getResource(); try { jedis.del(RedisKeys.getSetKey(task)); } finally { jedis.close(); } } @Override public void resetRequestRepeatCheck(Task task, Request request) { Jedis jedis = jedisPool.getResource(); try { jedis.srem(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } } }