CoAP : reuse executor for CoAP in flight expiring map use the retry filter executor in place of a polling worker thread.
Project: http://git-wip-us.apache.org/repos/asf/mina/repo Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/7459994a Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/7459994a Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/7459994a Branch: refs/heads/trunk Commit: 7459994a93416b304a1937ccff5aa6b240697645 Parents: df9203c Author: jvermillard <[email protected]> Authored: Wed Oct 30 11:05:54 2013 +0100 Committer: jvermillard <[email protected]> Committed: Wed Oct 30 11:05:54 2013 +0100 ---------------------------------------------------------------------- .../apache/mina/coap/retry/CoapRetryFilter.java | 14 +++-- .../org/apache/mina/coap/retry/ExpiringMap.java | 60 +++++--------------- .../apache/mina/coap/retry/ExpiringMapTest.java | 31 ++++++++-- 3 files changed, 48 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina/blob/7459994a/coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java ---------------------------------------------------------------------- diff --git a/coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java b/coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java index aa72568..374434d 100644 --- a/coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java +++ b/coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java @@ -60,11 +60,7 @@ public class CoapRetryFilter extends AbstractIoFilter { private Map<Integer, CoapTransmission> inFlight = new ConcurrentHashMap<>(); /** The list of processed messages used to handle duplicate copies of Confirmable messages */ - private ExpiringMap<Integer, CoapMessage> processed = new ExpiringMap<Integer, CoapMessage>(); - - public CoapRetryFilter() { - processed.start(); - } + private ExpiringMap<Integer, CoapMessage> processed = new ExpiringMap<Integer, CoapMessage>(retryExecutor); /** * {@inheritDoc} @@ -163,4 +159,12 @@ public class CoapRetryFilter extends AbstractIoFilter { } } + + /** + * clear the running executor + */ + @Override + protected void finalize() throws Throwable { + retryExecutor.shutdown(); + } } http://git-wip-us.apache.org/repos/asf/mina/blob/7459994a/coap/src/main/java/org/apache/mina/coap/retry/ExpiringMap.java ---------------------------------------------------------------------- diff --git a/coap/src/main/java/org/apache/mina/coap/retry/ExpiringMap.java b/coap/src/main/java/org/apache/mina/coap/retry/ExpiringMap.java index 796778d..6372ff7 100644 --- a/coap/src/main/java/org/apache/mina/coap/retry/ExpiringMap.java +++ b/coap/src/main/java/org/apache/mina/coap/retry/ExpiringMap.java @@ -19,12 +19,13 @@ */ package org.apache.mina.coap.retry; -import java.io.IOException; import java.util.Calendar; import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * A {@link Map} implementation backed with a {@link ConcurrentHashMap} providing entry expiration facilities. @@ -50,28 +51,30 @@ public class ExpiringMap<K, V> implements Map<K, V> { private final int expirationPeriod; private final int checkerPeriod; - /** The worker in charge of expiring the entries */ - private final Worker worker = new Worker(); - - private volatile boolean running = true; + /** For running expiration tasks */ + private ScheduledExecutorService executor; /** * A new expiring map * * @param expirationPeriod the expiration period for an entry * @param checkerPeriod the period between two checks of expired elements + * @param executor scheduled executor to be used for scheduling expiration tasks */ - public ExpiringMap(int expirationPeriod, int checkerPeriod) { + public ExpiringMap(int expirationPeriod, int checkerPeriod, ScheduledExecutorService executor) { this.expirationPeriod = expirationPeriod; this.checkerPeriod = checkerPeriod; + this.executor = executor; + executor.scheduleAtFixedRate(new ExpirationTask(), checkerPeriod, checkerPeriod, TimeUnit.SECONDS); } /** * A map with an expiration period of 30 seconds. The worker in charge of expiring the map entries will run every 10 * seconds. + * @param executor scheduled executor to be used for scheduling expiration tasks */ - public ExpiringMap() { - this(EXPIRATION_PERIOD_IN_SEC, CHECKER_PERIOD_IN_SEC); + public ExpiringMap(ScheduledExecutorService executor) { + this(EXPIRATION_PERIOD_IN_SEC, CHECKER_PERIOD_IN_SEC, executor); } /** @@ -198,48 +201,13 @@ public class ExpiringMap<K, V> implements Map<K, V> { } /** - * Start the thread in charge of expiring the elements - */ - public void start() { - worker.start(); - } - - /** - * Stop the cleaning thread - */ - @Override - public void finalize() throws IOException { - running = false; - try { - // interrupt the sleep - worker.interrupt(); - // wait for worker to stop - worker.join(); - } catch (InterruptedException e) { - // interrupted, we don't care much - } - } - - /** - * Thread in charge of removing the expired entries + * Task in chage of expriring values, to be scheduled. */ - private class Worker extends Thread { - - public Worker() { - super("ExpiringMapChecker"); - setDaemon(true); - } + private class ExpirationTask implements Runnable { @Override public void run() { - while (running) { - try { - sleep(checkerPeriod); - expire(System.currentTimeMillis()); - } catch (InterruptedException e) { - break; - } - } + expire(System.currentTimeMillis()); } } http://git-wip-us.apache.org/repos/asf/mina/blob/7459994a/coap/src/test/java/org/apache/mina/coap/retry/ExpiringMapTest.java ---------------------------------------------------------------------- diff --git a/coap/src/test/java/org/apache/mina/coap/retry/ExpiringMapTest.java b/coap/src/test/java/org/apache/mina/coap/retry/ExpiringMapTest.java index 44af22d..4bc3996 100644 --- a/coap/src/test/java/org/apache/mina/coap/retry/ExpiringMapTest.java +++ b/coap/src/test/java/org/apache/mina/coap/retry/ExpiringMapTest.java @@ -1,9 +1,16 @@ package org.apache.mina.coap.retry; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import org.junit.After; +import org.junit.Before; import org.junit.Test; /** @@ -11,9 +18,22 @@ import org.junit.Test; */ public class ExpiringMapTest { + private ScheduledExecutorService executor; + + @Before + public void setup() { + executor = Executors.newSingleThreadScheduledExecutor(); + } + + @After + public void dispose() { + executor.shutdown(); + } + @Test public void put_get() { - Map<String, String> map = new ExpiringMap<>(); + + Map<String, String> map = new ExpiringMap<>(executor); map.put("key1", "value1"); assertTrue(map.containsKey("key1")); @@ -25,7 +45,7 @@ public class ExpiringMapTest { @Test public void size() { - Map<String, String> map = new ExpiringMap<>(); + Map<String, String> map = new ExpiringMap<>(executor); map.put("key1", "value1"); map.put("key2", "value2"); @@ -34,7 +54,7 @@ public class ExpiringMapTest { @Test public void remove() { - Map<String, String> map = new ExpiringMap<>(); + Map<String, String> map = new ExpiringMap<>(executor); map.put("key1", "value1"); map.put("key2", "value2"); @@ -47,8 +67,7 @@ public class ExpiringMapTest { @Test public void expiring_element() throws InterruptedException { - ExpiringMap<String, String> map = new ExpiringMap<>(5, 1); - map.start(); + ExpiringMap<String, String> map = new ExpiringMap<>(5, 1, executor); map.put("key1", "value1");
