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.ShardedJedis; import redis.clients.jedis.ShardedJedisPool; /** * Created by brucezee on 2017/1/7. */ public class ShardedRedisScheduler extends NoRepeatScheduler implements SchedulerMonitor { protected ShardedJedisPool jedisPool; protected Serializer<Request> serializer; public ShardedRedisScheduler(ShardedJedisPool jedisPool) { this(jedisPool, new RequestJsonSerializer()); } public ShardedRedisScheduler(ShardedJedisPool jedisPool, Serializer<Request> serializer) { this(jedisPool, serializer, new ShardedRedisRepeatHandler(jedisPool), null); } public ShardedRedisScheduler(ShardedJedisPool 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) { ShardedJedis jedis = jedisPool.getResource(); try { jedis.rpush(RedisKeys.getQueueKey(task), serializer.serialize(request)); } finally { jedis.close(); } } @Override public Request doPoll(Task task) { ShardedJedis jedis = jedisPool.getResource(); try { return serializer.deserialize(jedis.lpop(RedisKeys.getQueueKey(task))); } finally { jedis.close(); } } @Override public int getTotalCount(Task task) { ShardedJedis jedis = jedisPool.getResource(); try { Long size = jedis.scard(RedisKeys.getSetKey(task)); return size.intValue(); } finally { jedis.close(); } } @Override public int getLeftCount(Task task) { ShardedJedis jedis = jedisPool.getResource(); try { Long size = jedis.llen(RedisKeys.getQueueKey(task)); return size.intValue(); } finally { jedis.close(); } } public ShardedJedisPool getJedisPool() { return jedisPool; } public void setJedisPool(ShardedJedisPool jedisPool) { this.jedisPool = jedisPool; } public Serializer<Request> getSerializer() { return serializer; } public void setSerializer(Serializer<Request> serializer) { this.serializer = serializer; } public static class ShardedRedisRepeatHandler implements RepeatHandler { protected ShardedJedisPool jedisPool; public ShardedRedisRepeatHandler(ShardedJedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public boolean isDuplicate(Task task, Request request) { ShardedJedis jedis = jedisPool.getResource(); try { return jedis.sismember(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } @Override public void addRepeatCheck(Task task, Request request) { ShardedJedis jedis = jedisPool.getResource(); try { jedis.sadd(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } @Override public void resetAllRepeatCheck(Task task) { ShardedJedis jedis = jedisPool.getResource(); try { jedis.del(RedisKeys.getSetKey(task)); } finally { jedis.close(); } } @Override public void resetRequestRepeatCheck(Task task, Request request) { ShardedJedis jedis = jedisPool.getResource(); try { jedis.srem(RedisKeys.getSetKey(task), request.key()); } finally { jedis.close(); } } } }