Fixed - destroy() method doesn't work if called immediately after creation of RDelayedQueue object. #5537

pull/6356/head
Nikita Koksharov 2 months ago
parent a932de8013
commit 59d756f221

@ -58,7 +58,7 @@ public abstract class QueueTransferTask {
} }
private int usage = 1; private volatile int usage = 1;
private final AtomicReference<TimeoutTask> lastTimeout = new AtomicReference<TimeoutTask>(); private final AtomicReference<TimeoutTask> lastTimeout = new AtomicReference<TimeoutTask>();
private final ServiceManager serviceManager; private final ServiceManager serviceManager;
@ -99,14 +99,23 @@ public abstract class QueueTransferTask {
public void stop() { public void stop() {
RTopic schedulerTopic = getTopic(); RTopic schedulerTopic = getTopic();
schedulerTopic.removeListener(messageListenerId, statusListenerId); schedulerTopic.removeListener(messageListenerId, statusListenerId);
TimeoutTask oldTimeout = lastTimeout.get();
if (oldTimeout != null) {
oldTimeout.getTask().cancel();
}
} }
private void scheduleTask(final Long startTime) { private void scheduleTask(final Long startTime) {
TimeoutTask oldTimeout = lastTimeout.get(); if (usage == 0) {
return;
}
if (startTime == null) { if (startTime == null) {
return; return;
} }
TimeoutTask oldTimeout = lastTimeout.get();
if (oldTimeout != null) { if (oldTimeout != null) {
oldTimeout.getTask().cancel(); oldTimeout.getTask().cancel();
} }
@ -137,6 +146,10 @@ public abstract class QueueTransferTask {
protected abstract RFuture<Long> pushTaskAsync(); protected abstract RFuture<Long> pushTaskAsync();
private void pushTask() { private void pushTask() {
if (usage == 0) {
return;
}
RFuture<Long> startTimeFuture = pushTaskAsync(); RFuture<Long> startTimeFuture = pushTaskAsync();
startTimeFuture.whenComplete((res, e) -> { startTimeFuture.whenComplete((res, e) -> {
if (e != null) { if (e != null) {

@ -1,6 +1,7 @@
package org.redisson; package org.redisson;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.redisson.api.RBlockingDeque;
import org.redisson.api.RBlockingQueue; import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue; import org.redisson.api.RDelayedQueue;
import org.redisson.api.RQueue; import org.redisson.api.RQueue;
@ -12,6 +13,22 @@ import static org.assertj.core.api.Assertions.assertThat;
public class RedissonDelayedQueueTest extends RedisDockerTest { public class RedissonDelayedQueueTest extends RedisDockerTest {
@Test
public void testDestroy() throws InterruptedException {
RBlockingDeque<Integer> blockingDeque = redisson.getBlockingDeque("test");
RDelayedQueue<Integer> delayedQueue = redisson.getDelayedQueue(blockingDeque);
delayedQueue.offer(1, 2, TimeUnit.SECONDS);
delayedQueue.destroy();
RDelayedQueue<Integer> delayedQueue2 = redisson.getDelayedQueue(blockingDeque);
delayedQueue2.destroy();
Thread.sleep(1000);
Object s = blockingDeque.poll(3, TimeUnit.SECONDS);
assertThat(s).isNull();
}
@Test @Test
public void testRemove() throws InterruptedException { public void testRemove() throws InterruptedException {
RBlockingQueue<String> blockingFairQueue = redisson.getBlockingQueue("delay_queue"); RBlockingQueue<String> blockingFairQueue = redisson.getBlockingQueue("delay_queue");

Loading…
Cancel
Save