From commits-return-8005-apmail-activemq-commits-archive=activemq.apache.org@activemq.apache.org Wed Feb 06 14:49:05 2008 Return-Path: Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: (qmail 61065 invoked from network); 6 Feb 2008 14:49:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Feb 2008 14:49:05 -0000 Received: (qmail 63888 invoked by uid 500); 6 Feb 2008 14:48:57 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 63828 invoked by uid 500); 6 Feb 2008 14:48:57 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 63819 invoked by uid 99); 6 Feb 2008 14:48:57 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Feb 2008 06:48:57 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Feb 2008 14:48:37 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 954CB1A9832; Wed, 6 Feb 2008 06:48:44 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r619004 - /activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java Date: Wed, 06 Feb 2008 14:48:44 -0000 To: commits@activemq.apache.org From: chirino@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080206144844.954CB1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: chirino Date: Wed Feb 6 06:48:42 2008 New Revision: 619004 URL: http://svn.apache.org/viewvc?rev=619004&view=rev Log: - Clients do not shutdown due to non-daemon threads hanging around. Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java?rev=619004&r1=619003&r2=619004&view=diff ============================================================================== --- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java (original) +++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java Wed Feb 6 06:48:42 2008 @@ -26,7 +26,6 @@ import org.apache.activemq.command.KeepAliveInfo; import org.apache.activemq.command.WireFormatInfo; -import org.apache.activemq.thread.Scheduler; import org.apache.activemq.thread.SchedulerTimerTask; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,8 +40,11 @@ private static final Log LOG = LogFactory.getLog(InactivityMonitor.class); private static final ThreadPoolExecutor ASYNC_TASKS; - private static final Timer READ_CHECK_TIMER = new Timer("InactivityMonitor ReadCheck"); - private static final Timer WRITE_CHECK_TIMER = new Timer("InactivityMonitor WriteCheck"); + + private static int CHECKER_COUNTER; + private static Timer READ_CHECK_TIMER; + private static Timer WRITE_CHECK_TIMER; + private WireFormatInfo localWireFormatInfo; private WireFormatInfo remoteWireFormatInfo; private final AtomicBoolean monitorStarted = new AtomicBoolean(false); @@ -55,6 +57,7 @@ private SchedulerTimerTask writeCheckerTask; private SchedulerTimerTask readCheckerTask; + private final Runnable readChecker = new Runnable() { long lastRunTime; public void run() { @@ -218,8 +221,15 @@ writeCheckerTask = new SchedulerTimerTask(writeChecker); readCheckerTask = new SchedulerTimerTask(readChecker); long writeCheckTime = checkTime/3; - WRITE_CHECK_TIMER.scheduleAtFixedRate(writeCheckerTask, writeCheckTime,writeCheckTime); - READ_CHECK_TIMER.scheduleAtFixedRate(readCheckerTask, checkTime,checkTime); + synchronized( InactivityMonitor.class ) { + if( CHECKER_COUNTER == 0 ) { + READ_CHECK_TIMER = new Timer("InactivityMonitor ReadCheck"); + WRITE_CHECK_TIMER = new Timer("InactivityMonitor WriteCheck"); + } + CHECKER_COUNTER++; + WRITE_CHECK_TIMER.scheduleAtFixedRate(writeCheckerTask, writeCheckTime,writeCheckTime); + READ_CHECK_TIMER.scheduleAtFixedRate(readCheckerTask, checkTime,checkTime); + } } } @@ -230,8 +240,17 @@ if (monitorStarted.compareAndSet(true, false)) { readCheckerTask.cancel(); writeCheckerTask.cancel(); - WRITE_CHECK_TIMER.purge(); - READ_CHECK_TIMER.purge(); + synchronized( InactivityMonitor.class ) { + WRITE_CHECK_TIMER.purge(); + READ_CHECK_TIMER.purge(); + CHECKER_COUNTER--; + if(CHECKER_COUNTER==0) { + WRITE_CHECK_TIMER.cancel(); + READ_CHECK_TIMER.cancel(); + WRITE_CHECK_TIMER = null; + READ_CHECK_TIMER = null; + } + } } }