You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2013/10/14 15:31:46 UTC

[3/3] git commit: CAMEL-6862: DefaultTimeoutMap - Should use start/stop to schedule the task, and cancel the task

CAMEL-6862: DefaultTimeoutMap - Should use start/stop to schedule the task, and cancel the task


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fed68b40
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fed68b40
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fed68b40

Branch: refs/heads/camel-2.11.x
Commit: fed68b407244fb21e91a2486477e3a6acf87ad56
Parents: 1765f1a
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Oct 14 15:24:49 2013 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Oct 14 15:31:31 2013 +0200

----------------------------------------------------------------------
 .../apache/camel/support/DefaultTimeoutMap.java | 12 ++++++++--
 .../camel/support/DefaultTimeoutMapTest.java    | 25 +++++++++++++++++++-
 2 files changed, 34 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fed68b40/camel-core/src/main/java/org/apache/camel/support/DefaultTimeoutMap.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/support/DefaultTimeoutMap.java b/camel-core/src/main/java/org/apache/camel/support/DefaultTimeoutMap.java
index 1b9d03f..4ca9c36 100644
--- a/camel-core/src/main/java/org/apache/camel/support/DefaultTimeoutMap.java
+++ b/camel-core/src/main/java/org/apache/camel/support/DefaultTimeoutMap.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -43,6 +44,8 @@ import org.slf4j.LoggerFactory;
  * You must provide a {@link java.util.concurrent.ScheduledExecutorService} in the constructor which is used
  * to schedule a background task which check for old entries to purge. This implementation will shutdown the scheduler
  * if its being stopped.
+ * You must also invoke {@link #start()} to startup the timeout map, before its ready to be used.
+ * And you must invoke {@link #stop()} to stop the map when no longer in use.
  *
  * @version 
  */
@@ -52,6 +55,7 @@ public class DefaultTimeoutMap<K, V> extends ServiceSupport implements TimeoutMa
 
     private final ConcurrentMap<K, TimeoutMapEntry<K, V>> map = new ConcurrentHashMap<K, TimeoutMapEntry<K, V>>();
     private final ScheduledExecutorService executor;
+    private volatile ScheduledFuture future;
     private final long purgePollTime;
     private final Lock lock = new ReentrantLock();
     private boolean useLock = true;
@@ -69,7 +73,6 @@ public class DefaultTimeoutMap<K, V> extends ServiceSupport implements TimeoutMa
         this.executor = executor;
         this.purgePollTime = requestMapPollTimeMillis;
         this.useLock = useLock;
-        schedulePoll();
     }
 
     public V get(K key) {
@@ -248,7 +251,7 @@ public class DefaultTimeoutMap<K, V> extends ServiceSupport implements TimeoutMa
      * lets schedule each time to allow folks to change the time at runtime
      */
     protected void schedulePoll() {
-        executor.scheduleWithFixedDelay(this, 0, purgePollTime, TimeUnit.MILLISECONDS);
+        future = executor.scheduleWithFixedDelay(this, 0, purgePollTime, TimeUnit.MILLISECONDS);
     }
 
     /**
@@ -276,10 +279,15 @@ public class DefaultTimeoutMap<K, V> extends ServiceSupport implements TimeoutMa
         if (executor.isShutdown()) {
             throw new IllegalStateException("The ScheduledExecutorService is shutdown");
         }
+        schedulePoll();
     }
 
     @Override
     protected void doStop() throws Exception {
+        if (future != null) {
+            future.cancel(false);
+            future = null;
+        }
         // clear map if we stop
         map.clear();
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/fed68b40/camel-core/src/test/java/org/apache/camel/support/DefaultTimeoutMapTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/support/DefaultTimeoutMapTest.java b/camel-core/src/test/java/org/apache/camel/support/DefaultTimeoutMapTest.java
index 51e0330..fcf52b8 100644
--- a/camel-core/src/test/java/org/apache/camel/support/DefaultTimeoutMapTest.java
+++ b/camel-core/src/test/java/org/apache/camel/support/DefaultTimeoutMapTest.java
@@ -31,15 +31,19 @@ public class DefaultTimeoutMapTest extends TestCase {
 
     private ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1);
 
-    public void testDefaultTimeoutMap() {
+    public void testDefaultTimeoutMap() throws Exception {
         DefaultTimeoutMap<?, ?> map = new DefaultTimeoutMap<Object, Object>(executor);
+        map.start();
         assertTrue(map.currentTime() > 0);
 
         assertEquals(0, map.size());
+
+        map.stop();
     }
 
     public void testDefaultTimeoutMapPurge() throws Exception {
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
+        map.start();
         assertTrue(map.currentTime() > 0);
 
         assertEquals(0, map.size());
@@ -50,10 +54,13 @@ public class DefaultTimeoutMapTest extends TestCase {
         Thread.sleep(250);
 
         assertEquals(0, map.size());
+
+        map.stop();
     }
 
     public void testDefaultTimeoutMapForcePurge() throws Exception {
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
+        map.start();
         assertTrue(map.currentTime() > 0);
 
         assertEquals(0, map.size());
@@ -71,6 +78,7 @@ public class DefaultTimeoutMapTest extends TestCase {
 
     public void testDefaultTimeoutMapGetRemove() throws Exception {
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
+        map.start();
         assertTrue(map.currentTime() > 0);
 
         assertEquals(0, map.size());
@@ -84,10 +92,13 @@ public class DefaultTimeoutMapTest extends TestCase {
         assertEquals(123, old);
         assertEquals(null, map.get("A"));
         assertEquals(0, map.size());
+
+        map.stop();
     }
 
     public void testDefaultTimeoutMapGetKeys() throws Exception {
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
+        map.start();
         assertTrue(map.currentTime() > 0);
 
         assertEquals(0, map.size());
@@ -105,6 +116,7 @@ public class DefaultTimeoutMapTest extends TestCase {
         ScheduledExecutorService e = Executors.newScheduledThreadPool(2);
 
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(e, 50);
+        map.start();
         assertEquals(50, map.getPurgePollTime());
 
         map.put("A", 123, 100);
@@ -116,6 +128,8 @@ public class DefaultTimeoutMapTest extends TestCase {
         assertEquals(0, map.size());
 
         assertSame(e, map.getExecutor());
+
+        map.stop();
     }
 
     public void testExpiredInCorrectOrder() throws Exception {
@@ -130,6 +144,7 @@ public class DefaultTimeoutMapTest extends TestCase {
                 return true;
             }
         };
+        map.start();
         assertEquals(0, map.size());
 
         map.put("A", 1, 50);
@@ -157,6 +172,8 @@ public class DefaultTimeoutMapTest extends TestCase {
         assertEquals(1, values.get(4).intValue());
 
         assertEquals(1, map.size());
+
+        map.stop();
     }
 
     public void testExpiredNotEvicted() throws Exception {
@@ -175,6 +192,7 @@ public class DefaultTimeoutMapTest extends TestCase {
                 return true;
             }
         };
+        map.start();
         assertEquals(0, map.size());
 
         map.put("A", 1, 90);
@@ -197,10 +215,13 @@ public class DefaultTimeoutMapTest extends TestCase {
         // and keep the gold in the map
         assertEquals(1, map.size());
         assertEquals(Integer.valueOf(9), map.get("gold"));
+
+        map.stop();
     }
 
     public void testDefaultTimeoutMapStopStart() throws Exception {
         DefaultTimeoutMap<String, Integer> map = new DefaultTimeoutMap<String, Integer>(executor, 100);
+        map.start();
         map.put("A", 1, 500);
 
         assertEquals(1, map.size());
@@ -220,6 +241,8 @@ public class DefaultTimeoutMapTest extends TestCase {
         Thread.sleep(250);
         // now it should be gone
         assertEquals(0, map.size());
+
+        map.stop();
     }
 
 }