From 1e90300183212520f833617cb76e540374ef8182 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 16 Sep 2016 11:08:57 +0200 Subject: [PATCH] use background task executor to refresh wind estimation track cache Change-Id: I6fa08dadde0893ddddbac7f09a1d86e98a8299c7 --- .../TrackBasedEstimationWindTrackImpl.java | 29 ++++++++----------- java/com.sap.sse.test/META-INF/MANIFEST.MF | 2 +- .../AbortingTaskScheduledAtFixedRateTest.java | 5 ++++ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java index b5b5e0746cc..d3f198f7562 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackBasedEstimationWindTrackImpl.java @@ -10,8 +10,7 @@ import java.util.Iterator; import java.util.Map; import java.util.NavigableSet; import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; +import java.util.concurrent.TimeUnit; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Mark; @@ -44,6 +43,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.SerializableComparator; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.ThreadPoolUtil; import com.sap.sse.util.impl.ArrayListNavigableSet; /** @@ -504,21 +504,16 @@ public class TrackBasedEstimationWindTrackImpl extends VirtualWindTrackImpl { if (delayForCacheInvalidationInMilliseconds == 0) { invalidateCache(); } else { - final Timer cacheInvalidationTimer = new Timer( - "TrackBasedEstimationWindTrackImpl cache invalidation timer for race " + getTrackedRace().getRace(), /* isDaemon */ true); - cacheInvalidationTimer.schedule(new TimerTask() { - @Override - public void run() { - // no locking required here; the incremental cache refresh protects the inner cache structures from concurrent modifications - cacheInvalidationTimer.cancel(); // terminates the timer thread - if (getTrackedRace().getStatus().getStatus() == TrackedRaceStatusEnum.LOADING) { - // during loading, only invalidate the cache after the interval expired but don't trigger incremental re-calculation - invalidateCache(); - } else { - refreshCacheIncrementally(); - } - } - }, delayForCacheInvalidationInMilliseconds); + ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor(). + schedule(()->{ + // no locking required here; the incremental cache refresh protects the inner cache structures from concurrent modifications + if (getTrackedRace().getStatus().getStatus() == TrackedRaceStatusEnum.LOADING) { + // during loading, only invalidate the cache after the interval expired but don't trigger incremental re-calculation + invalidateCache(); + } else { + refreshCacheIncrementally(); + } + }, delayForCacheInvalidationInMilliseconds, TimeUnit.MILLISECONDS); } } diff --git a/java/com.sap.sse.test/META-INF/MANIFEST.MF b/java/com.sap.sse.test/META-INF/MANIFEST.MF index 4d676a8bded..09b9c3c8b12 100644 --- a/java/com.sap.sse.test/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.test/META-INF/MANIFEST.MF @@ -6,4 +6,4 @@ Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP Fragment-Host: com.sap.sse Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Require-Bundle: org.junit4 +Require-Bundle: org.junit4;bundle-version="4.8.2" diff --git a/java/com.sap.sse.test/src/com/sap/sse/test/AbortingTaskScheduledAtFixedRateTest.java b/java/com.sap.sse.test/src/com/sap/sse/test/AbortingTaskScheduledAtFixedRateTest.java index d2b4e8e11fd..ded893a8b24 100644 --- a/java/com.sap.sse.test/src/com/sap/sse/test/AbortingTaskScheduledAtFixedRateTest.java +++ b/java/com.sap.sse.test/src/com/sap/sse/test/AbortingTaskScheduledAtFixedRateTest.java @@ -15,6 +15,11 @@ public class AbortingTaskScheduledAtFixedRateTest { private static final int RATE_IN_MILLIS = 100; private static final Logger logger = Logger.getLogger(AbortingTaskScheduledAtFixedRateTest.class.getName()); + /** + * Asserts that calling {@link ScheduledFuture#cancel(boolean)} on an object returned by + * {@link ScheduledExecutorService#scheduleAtFixedRate(Runnable, long, long, TimeUnit)} keeps the + * task from executing again. + */ @Test public void testAbortTaskScheduledAtFixedRate() throws InterruptedException { final int[] executions = new int[1];