Repository: karaf-decanter
Updated Branches:
  refs/heads/master c15db342c -> 86df6397f


[KARAF-4610] Use a Thread ExecutorService in the decanter scheduler


Project: http://git-wip-us.apache.org/repos/asf/karaf-decanter/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-decanter/commit/86df6397
Tree: http://git-wip-us.apache.org/repos/asf/karaf-decanter/tree/86df6397
Diff: http://git-wip-us.apache.org/repos/asf/karaf-decanter/diff/86df6397

Branch: refs/heads/master
Commit: 86df6397fcb673bd936804d1b931656ee58117c9
Parents: c15db34
Author: Jean-Baptiste Onofré <[email protected]>
Authored: Sun Jul 31 07:43:53 2016 +0200
Committer: Jean-Baptiste Onofré <[email protected]>
Committed: Sun Jul 31 07:43:53 2016 +0200

----------------------------------------------------------------------
 ...g.apache.karaf.decanter.scheduler.simple.cfg | 16 +++++++++++-
 .../scheduler/simple/SimpleScheduler.java       | 26 +++++++++++++++++++-
 2 files changed, 40 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/86df6397/scheduler/simple/src/main/cfg/org.apache.karaf.decanter.scheduler.simple.cfg
----------------------------------------------------------------------
diff --git 
a/scheduler/simple/src/main/cfg/org.apache.karaf.decanter.scheduler.simple.cfg 
b/scheduler/simple/src/main/cfg/org.apache.karaf.decanter.scheduler.simple.cfg
index a9b270e..9d554da 100644
--- 
a/scheduler/simple/src/main/cfg/org.apache.karaf.decanter.scheduler.simple.cfg
+++ 
b/scheduler/simple/src/main/cfg/org.apache.karaf.decanter.scheduler.simple.cfg
@@ -1,2 +1,16 @@
 # Define the Decanter simple scheduler period
-period=5000
\ No newline at end of file
+period=5000
+
+# scheduler thread pool
+
+# The time to wait before stopping an idle thread (in millesecond)
+# Default is 1 minute
+threadIdleTimeout=60000
+
+# Initial number of threads created by the scheduler
+# Default is 5
+threadInitCount=5
+
+# Maximum number of threads created by the scheduler
+# Default is 200
+threadMaxCount=200
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/86df6397/scheduler/simple/src/main/java/org/apache/karaf/decanter/scheduler/simple/SimpleScheduler.java
----------------------------------------------------------------------
diff --git 
a/scheduler/simple/src/main/java/org/apache/karaf/decanter/scheduler/simple/SimpleScheduler.java
 
b/scheduler/simple/src/main/java/org/apache/karaf/decanter/scheduler/simple/SimpleScheduler.java
index 0268264..22e35b9 100644
--- 
a/scheduler/simple/src/main/java/org/apache/karaf/decanter/scheduler/simple/SimpleScheduler.java
+++ 
b/scheduler/simple/src/main/java/org/apache/karaf/decanter/scheduler/simple/SimpleScheduler.java
@@ -19,6 +19,7 @@ package org.apache.karaf.decanter.scheduler.simple;
 import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.karaf.decanter.api.Scheduler;
@@ -42,7 +43,14 @@ public class SimpleScheduler implements Runnable, Scheduler {
     private final static Logger LOGGER = 
LoggerFactory.getLogger(SimpleScheduler.class);
 
     private AtomicBoolean running = new AtomicBoolean(false);
+
     private long period = 5000;
+    private long threadIdleTimeout = 60000;
+    private int threadInitCount = 5;
+    private int threadMaxCount = 200;
+
+    private ExecutorService executorService;
+
     Set<Runnable> collectors;
     
     public SimpleScheduler() {
@@ -59,6 +67,12 @@ public class SimpleScheduler implements Runnable, Scheduler {
     public void configure(Dictionary<String, String> config) {
         String periodSt = config.get("period");
         period = periodSt != null ? Integer.parseInt(periodSt) : 5000;
+        String threadIdleTimeoutSt = config.get("threadIdleTimeout");
+        threadIdleTimeout = threadIdleTimeoutSt != null ? 
Integer.parseInt(threadIdleTimeoutSt) : 60000;
+        String threadInitCountSt = config.get("threadInitCount");
+        threadInitCount = threadInitCountSt != null ? 
Integer.parseInt(threadInitCountSt) : 5;
+        String threadMaxCountSt = config.get("threadMaxCount");
+        threadMaxCount = threadMaxCountSt != null ? 
Integer.parseInt(threadMaxCountSt) : 200;
     }
 
     @Override
@@ -69,7 +83,7 @@ public class SimpleScheduler implements Runnable, Scheduler {
             LOGGER.debug("Calling the collectors ...");
             for (Runnable collector : collectors) {
                 try {
-                    collector.run();
+                    executorService.execute(collector);
                 } catch (Exception e) {
                     LOGGER.warn("Can't collect data", e);
                 }
@@ -91,12 +105,22 @@ public class SimpleScheduler implements Runnable, 
Scheduler {
 
     @Override
     public void stop() {
+        try {
+            executorService.awaitTermination(60L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            LOGGER.warn("Collectors still active", e);
+        }
+        executorService.shutdownNow();
         running.set(false);
     }
 
     @Override
     public void start() {
         if (running.compareAndSet(false, true)) {
+            executorService = new ThreadPoolExecutor(threadInitCount,
+                    threadMaxCount, threadIdleTimeout, TimeUnit.SECONDS,
+                    new SynchronousQueue<Runnable>(), 
Executors.defaultThreadFactory(),
+                    new ThreadPoolExecutor.CallerRunsPolicy());
             Thread thread = new Thread(this, "decanter-scheduler-simple");
             thread.start();
         }

Reply via email to