diff --git a/redisson-hibernate/pom.xml b/redisson-hibernate/pom.xml index ef6db0b26..0e2114ed8 100644 --- a/redisson-hibernate/pom.xml +++ b/redisson-hibernate/pom.xml @@ -56,7 +56,7 @@ com.h2database h2 - 2.1.210 + 2.2.220 test diff --git a/redisson/src/main/java/org/redisson/executor/TasksRunnerService.java b/redisson/src/main/java/org/redisson/executor/TasksRunnerService.java index 77a7c9257..54088c4fa 100644 --- a/redisson/src/main/java/org/redisson/executor/TasksRunnerService.java +++ b/redisson/src/main/java/org/redisson/executor/TasksRunnerService.java @@ -139,21 +139,15 @@ public class TasksRunnerService implements RemoteExecutorService { CronExpression expression = new CronExpression(params.getCronExpression()); expression.setTimeZone(TimeZone.getTimeZone(params.getTimezone())); Date nextStartDate = expression.getNextValidTimeAfter(new Date()); - RFuture future = null; - if (nextStartDate != null) { - RemoteExecutorServiceAsync service = asyncScheduledServiceAtFixed(params.getExecutorId(), params.getRequestId()); - params.setStartTime(nextStartDate.getTime()); - future = service.schedule(params); - } - try { - executeRunnable(params, nextStartDate == null); - } catch (Exception e) { - // cancel task if it throws an exception - if (future != null) { - future.cancel(true); - } - throw e; + + executeRunnable(params, nextStartDate == null); + + if (nextStartDate == null || !redisson.getMap(tasksName, StringCodec.INSTANCE).containsKey(params.getRequestId())) { + return; } + + params.setStartTime(nextStartDate.getTime()); + asyncScheduledServiceAtFixed(params.getExecutorId(), params.getRequestId()).schedule(params); } /** diff --git a/redisson/src/test/java/org/redisson/executor/RedissonScheduledExecutorServiceTest.java b/redisson/src/test/java/org/redisson/executor/RedissonScheduledExecutorServiceTest.java index 49d4409d1..c457b0b90 100644 --- a/redisson/src/test/java/org/redisson/executor/RedissonScheduledExecutorServiceTest.java +++ b/redisson/src/test/java/org/redisson/executor/RedissonScheduledExecutorServiceTest.java @@ -392,6 +392,42 @@ public class RedissonScheduledExecutorServiceTest extends BaseTest { assertThat(redisson.getAtomicLong("executed2").get()).isEqualTo(30); } + @Test + public void testCancelCronExpression() throws InterruptedException, ExecutionException { + RScheduledExecutorService executor = redisson.getExecutorService("test"); + RScheduledFuture future = executor.schedule(new ScheduledRunnableTask("executed"), CronSchedule.of("0/2 * * * * ?")); + Thread.sleep(TimeUnit.SECONDS.toMillis(10)); + assertThat(redisson.getAtomicLong("executed").get()).isEqualTo(5); + + cancel(future); + + Thread.sleep(TimeUnit.SECONDS.toMillis(3)); + assertThat(redisson.getAtomicLong("executed").get()).isEqualTo(5); + + executor.delete(); + redisson.getKeys().delete("executed"); + assertThat(redisson.getKeys().count()).isZero(); + } + + @Test + public void testCancelAndInterruptCronExpression() throws InterruptedException, ExecutionException { + RScheduledExecutorService executor = redisson.getExecutorService("test"); + RScheduledFuture future = executor.schedule(new ScheduledLongRepeatableTask("counter", "executed"), CronSchedule.of("0/2 * * * * ?")); + Thread.sleep(TimeUnit.SECONDS.toMillis(6)); + assertThat(redisson.getAtomicLong("counter").get()).isEqualTo(3); + + cancel(future); + Thread.sleep(50); + assertThat(redisson.getBucket("executed").get()).isGreaterThan(1000L); + + Thread.sleep(TimeUnit.SECONDS.toMillis(3)); + assertThat(redisson.getAtomicLong("counter").get()).isEqualTo(3); + + executor.delete(); + redisson.getKeys().delete("counter", "executed"); + assertThat(redisson.getKeys().count()).isZero(); + } + public static class RunnableTask2 implements Runnable, Serializable { @Override