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");
 

Reply via email to