You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ch...@apache.org on 2005/12/21 06:51:46 UTC

svn commit: r358218 - in /webservices/axis2/trunk/java/modules/core/src/org/apache/axis2: context/ConfigurationContext.java util/SGContextGarbageCollector.java

Author: chinthaka
Date: Tue Dec 20 21:51:35 2005
New Revision: 358218

URL: http://svn.apache.org/viewcvs?rev=358218&view=rev
Log:
SGCtxt and ServiceContexts are also garbage collected now. Eventhough this was achieved using a thread initially, we thought better to minimize the number of threads. So now this GC happens, whenever there is an addition to the serviceGroupContextMap in the configuration context.
Another good news is that, I don't see any more memory leaks, except SimpleConnectionThread objects. So all in all Axis2 seems good in terms of memory ( at least for me :) ).

Removed:
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/SGContextGarbageCollector.java
Modified:
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java?rev=358218&r1=358217&r2=358218&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java Tue Dec 20 21:51:35 2005
@@ -20,16 +20,16 @@
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.engine.AxisConfiguration;
-import org.apache.axis2.util.SGContextGarbageCollector;
 import org.apache.axis2.util.UUIDGenerator;
 import org.apache.axis2.util.threadpool.ThreadFactory;
 import org.apache.axis2.util.threadpool.ThreadPool;
 
 import java.io.File;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.Map;
-import java.util.Timer;
 
 /**
  * This contains all the configuration information for Axis2.
@@ -47,19 +47,14 @@
     private File rootDir;
     private transient ThreadFactory threadPool;
 
+    // current time out interval is 30 secs. Need to make this configurable
+    private long serviceGroupContextTimoutInterval = 30 * 1000;
+
     public ConfigurationContext(AxisConfiguration axisConfiguration) {
         super(null);
         this.axisConfiguration = axisConfiguration;
     }
 
-    private void startTimerTaskToTimeOutSGCtxt() {
-        int delay = 5000;   // delay for 5 sec.
-        int period = 3000;  // repeat every 3 sec.
-        Timer timer = new Timer();
-
-        timer.schedule(new SGContextGarbageCollector(serviceGroupContextMap, 5 * 1000), delay, period);
-    }
-
     protected void finalize() throws Throwable {
         super.finalize();    //To change body of overridden methods use File | Settings | File Templates.
     }
@@ -88,11 +83,11 @@
         ServiceContext serviceContext;
 
         if (!isNull(serviceGroupContextId)
-                && (serviceGroupContextMap.get(serviceGroupContextId) != null)) {
+                && (getServiceGroupContext(serviceGroupContextId) != null)) {
 
             // SGC is already there
             serviceGroupContext =
-                    (ServiceGroupContext) serviceGroupContextMap.get(serviceGroupContextId);
+                    getServiceGroupContext(serviceGroupContextId);
             serviceContext =
                     serviceGroupContext.getServiceContext(messageContext.getAxisService().getName());
         } else {
@@ -142,8 +137,12 @@
 
         if (serviceGroupContextMap.get(id) == null) {
             serviceGroupContextMap.put(id, serviceGroupContext);
+            serviceGroupContext.touch();
             serviceGroupContext.setParent(this);
         }
+
+        // this is the best time to clean up the SGCtxts that are not being used anymore
+        cleanupServiceGroupContexts();
     }
 
     public AxisConfiguration getAxisConfiguration() {
@@ -186,9 +185,13 @@
         return (ServiceContext) this.serviceContextMap.get(serviceInstanceID);
     }
 
-    public ServiceGroupContext getServiceGroupContext(String serviceGroupContextId) {
+    public synchronized ServiceGroupContext getServiceGroupContext(String serviceGroupContextId) {
         if (serviceGroupContextMap != null) {
-            return (ServiceGroupContext) serviceGroupContextMap.get(serviceGroupContextId);
+            ServiceGroupContext serviceGroupContext = (ServiceGroupContext) serviceGroupContextMap.get(serviceGroupContextId);
+            if (serviceGroupContext != null) {
+                serviceGroupContext.touch();
+            }
+            return serviceGroupContext;
         }
 
         return null;
@@ -244,6 +247,20 @@
             threadPool = pool;
         } else {
             throw new AxisFault("Thread pool already set.");
+        }
+    }
+
+    private void cleanupServiceGroupContexts() {
+        synchronized (serviceGroupContextMap) {
+            long currentTime = new Date().getTime();
+            Iterator sgCtxtMapKeyIter = serviceGroupContextMap.keySet().iterator();
+            while (sgCtxtMapKeyIter.hasNext()) {
+                String sgCtxtId = (String) sgCtxtMapKeyIter.next();
+                ServiceGroupContext serviceGroupContext = (ServiceGroupContext) serviceGroupContextMap.get(sgCtxtId);
+                if ((currentTime - serviceGroupContext.getLastTouchedTime()) > serviceGroupContextTimoutInterval) {
+                    sgCtxtMapKeyIter.remove();
+                }
+            }
         }
     }
 }