You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2008/02/06 15:48:44 UTC

svn commit: r619004 - /activemq/trunk/activemq-core/src/main/java/org/apache/activemq/transport/InactivityMonitor.java

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;
+	            }
+            }
         }
     }