diff --git a/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java b/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java index 78d412b3b..7baec34f8 100644 --- a/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java +++ b/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java @@ -324,10 +324,6 @@ public class RedissonBoundedBlockingQueue<V> extends RedissonQueue<V> implements @Override public int drainTo(Collection<? super V> c, int maxElements) { - if (maxElements <= 0) { - return 0; - } - return get(drainToAsync(c, maxElements)); } @@ -336,7 +332,10 @@ public class RedissonBoundedBlockingQueue<V> extends RedissonQueue<V> implements if (c == null) { throw new NullPointerException(); } - + if (maxElements <= 0) { + return new CompletableFutureWrapper<>(0); + } + return commandExecutor.evalWriteAsync(getRawName(), codec, new RedisCommand<Object>("EVAL", new ListDrainToDecoder(c)), "local elemNum = math.min(ARGV[1], redis.call('llen', KEYS[1])) - 1;" + "local vals = redis.call('lrange', KEYS[1], 0, elemNum); " + diff --git a/redisson/src/test/java/org/redisson/RedissonBoundedBlockingQueueTest.java b/redisson/src/test/java/org/redisson/RedissonBoundedBlockingQueueTest.java index 2c201355f..b3eb51e00 100644 --- a/redisson/src/test/java/org/redisson/RedissonBoundedBlockingQueueTest.java +++ b/redisson/src/test/java/org/redisson/RedissonBoundedBlockingQueueTest.java @@ -621,6 +621,20 @@ public class RedissonBoundedBlockingQueueTest extends RedisDockerTest { assertThat(queue.remainingCapacity()).isEqualTo(100); Assertions.assertEquals(0, queue.size()); } + + @Test + public void testDrainToAsync() throws ExecutionException, InterruptedException { + RBoundedBlockingQueue<Integer> queue = redisson.getBoundedBlockingQueue("queue"); + queue.trySetCapacity(100); + for (int i = 0 ; i < 100; i++) { + assertThat(queue.offer(i)).isTrue(); + } + Assertions.assertEquals(100, queue.size()); + Set<Integer> batch = new HashSet<Integer>(); + RFuture<Integer> future = queue.drainToAsync(batch, 0); + Assertions.assertEquals(future.get(), 0); + Assertions.assertEquals(batch.size(), 0); + } @Test public void testBlockingQueue() {