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(); }
