From 4565719728d0ff78bda12e0bf8693c5d3fb73fa0 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 5 Jun 2020 18:31:07 +1200 Subject: [PATCH] #2017 - ENH: Add option for different initialDelay to BackgroundExecutor.executePeriodically() --- src/main/java/io/ebean/BackgroundExecutor.java | 7 +++++-- .../server/core/DefaultBackgroundExecutor.java | 13 +++++++------ .../server/deploy/BeanDescriptorManager.java | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/ebean/BackgroundExecutor.java b/src/main/java/io/ebean/BackgroundExecutor.java index f6439773e..9ffa4b62b 100644 --- a/src/main/java/io/ebean/BackgroundExecutor.java +++ b/src/main/java/io/ebean/BackgroundExecutor.java @@ -31,15 +31,18 @@ public interface BackgroundExecutor { * Execute a task periodically with a fixed delay between each execution. *

* For example, execute a runnable every minute. - *

*

* The delay is the time between executions no matter how long the task took. * That is, this method has the same behaviour characteristics as * {@link ScheduledExecutorService#scheduleWithFixedDelay(Runnable, long, long, TimeUnit)} - *

*/ void executePeriodically(Runnable r, long delay, TimeUnit unit); + /** + * Execute a task periodically additionally with an initial delay different from delay. + */ + void executePeriodically(Runnable r, long initialDelay, long delay, TimeUnit unit); + /** * Schedules a Runnable for one-shot action that becomes enabled after the given delay. * diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultBackgroundExecutor.java b/src/main/java/io/ebeaninternal/server/core/DefaultBackgroundExecutor.java index e48d7463d..89f6aa333 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultBackgroundExecutor.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultBackgroundExecutor.java @@ -33,7 +33,6 @@ public class DefaultBackgroundExecutor implements SpiBackgroundExecutor { @Override public void execute(Runnable r) { final Map map = MDC.getCopyOfContextMap(); - if (map == null) { pool.execute(r); } else { @@ -50,10 +49,14 @@ public class DefaultBackgroundExecutor implements SpiBackgroundExecutor { @Override public void executePeriodically(Runnable r, long delay, TimeUnit unit) { - final Map map = MDC.getCopyOfContextMap(); + executePeriodically(r, delay, delay, unit); + } + @Override + public void executePeriodically(Runnable r, long initialDelay, long delay, TimeUnit unit) { + final Map map = MDC.getCopyOfContextMap(); if (map == null) { - schedulePool.scheduleWithFixedDelay(r, delay, delay, unit); + schedulePool.scheduleWithFixedDelay(r, initialDelay, delay, unit); } else { schedulePool.scheduleWithFixedDelay(() -> { MDC.setContextMap(map); @@ -62,14 +65,13 @@ public class DefaultBackgroundExecutor implements SpiBackgroundExecutor { } finally { MDC.clear(); } - }, delay, delay, unit); + }, initialDelay, delay, unit); } } @Override public ScheduledFuture schedule(Runnable r, long delay, TimeUnit unit) { final Map map = MDC.getCopyOfContextMap(); - if (map == null) { return schedulePool.schedule(r, delay, unit); } else { @@ -87,7 +89,6 @@ public class DefaultBackgroundExecutor implements SpiBackgroundExecutor { @Override public ScheduledFuture schedule(Callable c, long delay, TimeUnit unit) { final Map map = MDC.getCopyOfContextMap(); - if (map == null) { return schedulePool.schedule(c, delay, unit); } else { diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 724c2507b..3ab92c5b1 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -245,7 +245,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { * Run periodic trim of query plans. */ public void scheduleBackgroundTrim() { - backgroundExecutor.executePeriodically(this::trimQueryPlans, 60L, TimeUnit.SECONDS); + backgroundExecutor.executePeriodically(this::trimQueryPlans, 117L, 60L, TimeUnit.SECONDS); } private void trimQueryPlans() {