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:45 UTC
[2/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/e7bf1703
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e7bf1703
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e7bf1703
Branch: refs/heads/camel-2.12.x
Commit: e7bf1703d5e73454bc947868ef95af5ee3dd1366
Parents: 0fc72e8
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:15 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/e7bf1703/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 4f252fe..7dd60ee 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/e7bf1703/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();
}
}