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