[Jboss-cvs] JBossAS SVN: r56114 - branches/JBoss_4_0_3_SP1_JBAS_3511/server/src/main/org/jboss/jms/asf

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Aug 21 11:57:07 EDT 2006


Author: weston.price at jboss.com
Date: 2006-08-21 11:57:05 -0400 (Mon, 21 Aug 2006)
New Revision: 56114

Modified:
   branches/JBoss_4_0_3_SP1_JBAS_3511/server/src/main/org/jboss/jms/asf/JmsServerSessionReaper.java
Log:
[JBAS-3511] Adding removal feature to reaper.

Modified: branches/JBoss_4_0_3_SP1_JBAS_3511/server/src/main/org/jboss/jms/asf/JmsServerSessionReaper.java
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3511/server/src/main/org/jboss/jms/asf/JmsServerSessionReaper.java	2006-08-21 15:25:05 UTC (rev 56113)
+++ branches/JBoss_4_0_3_SP1_JBAS_3511/server/src/main/org/jboss/jms/asf/JmsServerSessionReaper.java	2006-08-21 15:57:05 UTC (rev 56114)
@@ -1,16 +1,126 @@
 package org.jboss.jms.asf;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.jboss.logging.Logger;
+
+/**
+ * A JmsServerSessionReaper.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
 public class JmsServerSessionReaper
 {
    
+   private static final Logger logger = Logger.getLogger(JmsServerSessionReaper.class);
+   private static final Collection pools = new ArrayList();
+   private long interval = Long.MAX_VALUE;
+   private long next = Long.MAX_VALUE;
+   private Thread reaperThread;
+   
+   private static final JmsServerSessionReaper reaper = new JmsServerSessionReaper();
+   
    public static void registerSessionPool(StdServerSessionPool pool, long interval)
    {
-      
+      reaper.internalRegisterPool(pool, interval);
    }
    
    public static void unregisterSessionPool(StdServerSessionPool pool)
+   {     
+      reaper.internalUnregisterPool(pool);
+   }
+
+   private JmsServerSessionReaper()
    {
+      reaperThread = new Thread(
+            new Runnable() {
+
+               public void run()
+               {
+                  synchronized (pools)
+                  {
+                     while (true)
+                     {
+                        try 
+                        {
+                           pools.wait(interval);
+                           logger.debug("run: IdleRemover notifying pools, interval: " + interval);
+                           
+                           for (Iterator i = pools.iterator(); i.hasNext(); ) 
+                           {
+                             StdServerSessionPool pool = (StdServerSessionPool)i.next();
+                             pool.removeTimedOut();
+                           } 
+                           next = System.currentTimeMillis() + interval;
+                           
+                           if (next < 0) 
+                           {
+                              next = Long.MAX_VALUE;      
+                           } 
+                           
+                        }
+                        catch (InterruptedException ie)
+                        {
+                           logger.info("run: IdleRemover has been interrupted, returning");
+                           return;  
+                        } // end of try-catch
+                        catch (RuntimeException e)
+                        {
+                           logger.warn("run: IdleRemover ignored unexpected runtime exception", e);
+                        }
+                        catch (Error e)
+                        {
+                           logger.warn("run: IdleRemover ignored unexpected error", e);
+                        }
+                           
+                     } 
+                     
+                  }
+               }
+            }, "IdleRemover");
+         reaperThread.setDaemon(true);
+         reaperThread.start();
       
+   }
+   private void internalRegisterPool(StdServerSessionPool pool, long interval)
+   {
+      logger.debug("Registering StdServerSessionPool with interval " + interval);
       
+      synchronized (pools)
+      {
+         pools.add(pool);
+         
+         if (interval > 1 && interval/2 < this.interval) 
+         {
+            this.interval = interval/2;
+            long maybeNext = System.currentTimeMillis() + this.interval;
+            if (next > maybeNext && maybeNext > 0) 
+            {
+               next = maybeNext;
+               logger.debug("internalRegisterPool: about to notify thread: old next: " + next + ", new next: " + maybeNext);
+               pools.notify();
+
+            } 
+            
+         } 
+      }
+      
    }
+   
+   private void internalUnregisterPool(StdServerSessionPool pool)
+   {
+      synchronized (pools)
+      {
+         pools.remove(pool);
+         if (pools.size() == 0) 
+         {
+            logger.debug("internalUnregisterPool: setting interval to Long.MAX_VALUE");
+            interval = Long.MAX_VALUE;
+         } 
+         
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list