From a69c3e78c5b29dae72a30f193044f087f9213e62 Mon Sep 17 00:00:00 2001 From: "Hiram R. Chirino" Date: Mon, 10 Sep 2007 18:27:40 +0000 Subject: [PATCH] Switch to using a Timer to schedual tasks. Seems to have much more acurate time delays between executions. git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@574321 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/activemq/thread/Scheduler.java | 52 ++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/activemq-core/src/main/java/org/apache/activemq/thread/Scheduler.java b/activemq-core/src/main/java/org/apache/activemq/thread/Scheduler.java index e050674c3d..ad5991c31e 100755 --- a/activemq-core/src/main/java/org/apache/activemq/thread/Scheduler.java +++ b/activemq-core/src/main/java/org/apache/activemq/thread/Scheduler.java @@ -17,54 +17,48 @@ package org.apache.activemq.thread; import java.util.HashMap; - -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; +import java.util.Timer; +import java.util.TimerTask; /** * @version $Revision$ */ public final class Scheduler { - public static final ScheduledThreadPoolExecutor CLOCK_DAEMON = new ScheduledThreadPoolExecutor(5, createThreadFactory()); - static { - CLOCK_DAEMON.setKeepAliveTime(5, TimeUnit.SECONDS); - } - private static final HashMap CLOCK_TICKETS = new HashMap(); + private static final class SchedulerTimerTask extends TimerTask { + private final Runnable task; + + private SchedulerTimerTask(Runnable task) { + this.task = task; + } + + public void run() { + task.run(); + } + } + + public static final Timer CLOCK_DAEMON = new Timer("ActiveMQ Scheduler", true); + private static final HashMap TIMER_TASKS = new HashMap(); private Scheduler() { } - private static ThreadFactory createThreadFactory() { - return new ThreadFactory() { - public Thread newThread(Runnable runnable) { - Thread thread = new Thread(runnable, "ActiveMQ Scheduler"); - thread.setDaemon(true); - return thread; - } - }; - } - public static synchronized void executePeriodically(final Runnable task, long period) { - ScheduledFuture ticket = CLOCK_DAEMON - .scheduleAtFixedRate(task, period, period, TimeUnit.MILLISECONDS); - CLOCK_TICKETS.put(task, ticket); + TimerTask timerTask = new SchedulerTimerTask(task); + CLOCK_DAEMON.scheduleAtFixedRate(timerTask, period, period); + TIMER_TASKS.put(task, timerTask); } public static synchronized void cancel(Runnable task) { - ScheduledFuture ticket = CLOCK_TICKETS.remove(task); + TimerTask ticket = TIMER_TASKS.remove(task); if (ticket != null) { - ticket.cancel(false); - if (ticket instanceof Runnable) { - CLOCK_DAEMON.remove((Runnable)ticket); - } + ticket.cancel(); } } public static void executeAfterDelay(final Runnable task, long redeliveryDelay) { - CLOCK_DAEMON.schedule(task, redeliveryDelay, TimeUnit.MILLISECONDS); + TimerTask timerTask = new SchedulerTimerTask(task); + CLOCK_DAEMON.schedule(timerTask, redeliveryDelay); } }