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/20 16:11:54 UTC

svn commit: r358018 - in /webservices/axis2/trunk/java/modules/core: src/org/apache/axis2/context/ src/org/apache/axis2/description/ src/org/apache/axis2/engine/ src/org/apache/axis2/transport/http/server/ src/org/apache/axis2/util/ webapp/

Author: chinthaka
Date: Tue Dec 20 07:11:31 2005
New Revision: 358018

URL: http://svn.apache.org/viewcvs?rev=358018&view=rev
Log:
- improving the code
- adding a TimerThread to garbage collect SGContext and ServiceContext. Yet to be completed.

Added:
    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/AbstractContext.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContext.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/OperationContext.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/AxisServiceGroup.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/engine/AxisConfiguration.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/server/SimpleConnectionThread.java
    webservices/axis2/trunk/java/modules/core/webapp/ViewContexts.jsp
    webservices/axis2/trunk/java/modules/core/webapp/viewServiceContext.jsp
    webservices/axis2/trunk/java/modules/core/webapp/viewServiceGroupContext.jsp

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/AbstractContext.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/AbstractContext.java?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/AbstractContext.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/AbstractContext.java Tue Dec 20 07:11:31 2005
@@ -19,6 +19,7 @@
 
 import org.apache.axis2.client.Options;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -27,6 +28,8 @@
  * This is the top most level of the Context hierachy and is a bag of properties.
  */
 public abstract class AbstractContext {
+    protected long lastTouchedTime;
+
     protected AbstractContext parent;
     protected Map properties;
 
@@ -108,5 +111,25 @@
      */
     public void setProperty(String key, Object value) {
         properties.put(key, value);
+    }
+
+    /**
+     * ServiceContext and ServiceGroupContext are not getting automatically garbage collected. And there
+     * is no specific way for some one to go and make it garbage collectable.
+     * So the current solution is to make them time out. So the logic is that, there is a timer task
+     * in each and every service group which will check for the last touched time. And if it has not
+     * been touched for some time, the timer task will remove it from the memory.
+     * The touching logic happens like this. Whenever there is a call to addMessageContext in the operationContext
+     * it will go and update operationCOntext -> serviceContext -> serviceGroupContext.
+     */
+    protected void touch() {
+        lastTouchedTime = new Date().getTime();
+        if (parent != null) {
+            parent.touch();
+        }
+    }
+
+    public long getLastTouchedTime() {
+        return lastTouchedTime;
     }
 }

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=358018&r1=358017&r2=358018&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 07:11:31 2005
@@ -20,14 +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 javax.xml.namespace.QName;
 import java.io.File;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Map;
+import java.util.Timer;
 
 /**
  * This contains all the configuration information for Axis2.
@@ -39,8 +41,8 @@
      * <code>OperationContext</code> mapping.
      */
     private final Map operationContextMap = new HashMap();
-    private final Map serviceContextMap = new HashMap();
-    private final Map serviceGroupContextMap = new HashMap();
+    private final Map serviceContextMap = new Hashtable();
+    private Hashtable serviceGroupContextMap = new Hashtable();
     private transient AxisConfiguration axisConfiguration;
     private File rootDir;
     private transient ThreadFactory threadPool;
@@ -48,6 +50,15 @@
     public ConfigurationContext(AxisConfiguration axisConfiguration) {
         super(null);
         this.axisConfiguration = axisConfiguration;
+        startTimerTaskToTimeOutSGCtxt();
+    }
+
+    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 {
@@ -127,15 +138,7 @@
         this.operationContextMap.put(messageID, mepContext);
     }
 
-    /**
-     * Registers a ServiceContext with a given service ID.
-     */
-    public synchronized void registerServiceContext(String serviceInstanceID,
-                                                    ServiceContext serviceContext) {
-        this.serviceContextMap.put(serviceInstanceID, serviceContext);
-    }
-
-    public void registerServiceGroupContext(ServiceGroupContext serviceGroupContext) {
+    public synchronized void registerServiceGroupContext(ServiceGroupContext serviceGroupContext) {
         String id = serviceGroupContext.getId();
 
         if (serviceGroupContextMap.get(id) == null) {
@@ -144,10 +147,6 @@
         }
     }
 
-    public synchronized void removeService(QName name) {
-        serviceContextMap.remove(name);
-    }
-
     public AxisConfiguration getAxisConfiguration() {
         return axisConfiguration;
     }
@@ -201,8 +200,8 @@
      *
      * @return Returns hashmap of ServiceGroupContexts.
      */
-    public HashMap getServiceGroupContexts() {
-        return (HashMap) serviceGroupContextMap;
+    public Hashtable getServiceGroupContexts() {
+        return serviceGroupContextMap;
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/OperationContext.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/OperationContext.java?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/OperationContext.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/OperationContext.java Tue Dec 20 07:11:31 2005
@@ -80,11 +80,13 @@
      *
      * @param msgContext
      */
-    public synchronized void addMessageContext(MessageContext msgContext) throws AxisFault {
+    public void addMessageContext(MessageContext msgContext) throws AxisFault {
         if (axisOperation != null) {
             axisOperation.addMessageContext(msgContext, this);
+            touch();
         }
     }
+
 
     /**
      * Removes the pointers to this <code>OperationContext</code> in the

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/AxisServiceGroup.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/AxisServiceGroup.java?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/AxisServiceGroup.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/description/AxisServiceGroup.java Tue Dec 20 07:11:31 2005
@@ -92,7 +92,7 @@
         paramInclude.addParameter(param);
     }
 
-    public synchronized void addService(AxisService service) throws AxisFault {
+    public void addService(AxisService service) throws AxisFault {
         service.setParent(this);
 
         AxisConfiguration axisConfig = getParent();
@@ -165,7 +165,7 @@
         }
     }
 
-    public synchronized void removeService(QName name) throws AxisFault {
+    public void removeService(QName name) throws AxisFault {
         AxisService service = getService(name);
 
         if (service != null) {

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/engine/AxisConfiguration.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/engine/AxisConfiguration.java?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/engine/AxisConfiguration.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/engine/AxisConfiguration.java Tue Dec 20 07:11:31 2005
@@ -21,16 +21,7 @@
 import org.apache.axis2.deployment.DeploymentEngine;
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
 import org.apache.axis2.deployment.util.PhasesInfo;
-import org.apache.axis2.description.AxisService;
-import org.apache.axis2.description.AxisServiceGroup;
-import org.apache.axis2.description.HandlerDescription;
-import org.apache.axis2.description.ModuleConfiguration;
-import org.apache.axis2.description.ModuleDescription;
-import org.apache.axis2.description.Parameter;
-import org.apache.axis2.description.ParameterInclude;
-import org.apache.axis2.description.ParameterIncludeImpl;
-import org.apache.axis2.description.TransportInDescription;
-import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.description.*;
 import org.apache.axis2.om.OMElement;
 import org.apache.axis2.util.HostConfiguration;
 import org.apache.commons.logging.Log;
@@ -126,7 +117,7 @@
      * @param module
      * @throws AxisFault
      */
-    public synchronized void addModule(ModuleDescription module) throws AxisFault {
+    public void addModule(ModuleDescription module) throws AxisFault {
         module.setParent(this);
         modules.put(module.getName(), module);
     }
@@ -172,7 +163,7 @@
         addServiceGroup(axisServiceGroup);
     }
 
-    public void addServiceGroup(AxisServiceGroup axisServiceGroup) throws AxisFault {
+    public synchronized void addServiceGroup(AxisServiceGroup axisServiceGroup) throws AxisFault {
         Iterator services = axisServiceGroup.getServices();
 
         axisServiceGroup.setParent(this);
@@ -213,7 +204,7 @@
      * @param transport
      * @throws AxisFault
      */
-    public synchronized void addTransportIn(TransportInDescription transport) throws AxisFault {
+    public void addTransportIn(TransportInDescription transport) throws AxisFault {
         transportsIn.put(transport.getName(), transport);
     }
 
@@ -223,7 +214,7 @@
      * @param transport
      * @throws AxisFault
      */
-    public synchronized void addTransportOut(TransportOutDescription transport) throws AxisFault {
+    public void addTransportOut(TransportOutDescription transport) throws AxisFault {
         transportsOut.put(transport.getName(), transport);
     }
 

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/server/SimpleConnectionThread.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/server/SimpleConnectionThread.java?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/server/SimpleConnectionThread.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/http/server/SimpleConnectionThread.java Tue Dec 20 07:11:31 2005
@@ -40,7 +40,7 @@
  * Simple HTTP connection thread.
  */
 public class SimpleConnectionThread implements Runnable {
-    private static final Log LOG =
+    private static final Log log =
             LogFactory.getLog(SimpleConnectionThread.class);
     public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1";
     private SimpleHttpServerConnection conn = null;
@@ -51,7 +51,7 @@
 
     public SimpleConnectionThread(final String name, final SimpleHttpServerConnection conn,
                                   final SimpleConnSet connpool, final HttpRequestHandler handler)
-            throws IOException {
+            {
 
         // super(tg, name);
         if (conn == null) {
@@ -100,10 +100,11 @@
                 }
             } while (this.conn.isKeepAlive());
         } catch (InterruptedIOException e) {
+            log.error("Can not run SimpleConnectionThread ", e);
         }
         catch (IOException e) {
-            if (!this.stopped && !Thread.interrupted() && LOG.isDebugEnabled()) {
-                LOG.debug("[" + this.name + "] I/O error: " + e.getMessage());
+            if (!this.stopped && !Thread.interrupted() && log.isDebugEnabled()) {
+                log.debug("[" + this.name + "] I/O error: " + e.getMessage());
             }
         } finally {
             destroy();

Added: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/SGContextGarbageCollector.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/SGContextGarbageCollector.java?rev=358018&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/SGContextGarbageCollector.java (added)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/SGContextGarbageCollector.java Tue Dec 20 07:11:31 2005
@@ -0,0 +1,50 @@
+package org.apache.axis2.util;
+
+import org.apache.axis2.context.ServiceGroupContext;
+
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.TimerTask;
+
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @author : Eran Chinthaka (chinthaka@apache.org)
+ */
+
+public class SGContextGarbageCollector extends TimerTask {
+
+    private Hashtable serviceGroupContextMap;
+    private long timeOutInterval;
+
+    public SGContextGarbageCollector(Hashtable serviceGroupContextMap, long timeOutInterval) {
+        this.serviceGroupContextMap = serviceGroupContextMap;
+        this.timeOutInterval = timeOutInterval;
+    }
+
+    public void run() {
+        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()) > timeOutInterval) {
+
+                serviceGroupContextMap.remove(sgCtxtId);
+            }
+        }
+    }
+}

Modified: webservices/axis2/trunk/java/modules/core/webapp/ViewContexts.jsp
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/webapp/ViewContexts.jsp?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/webapp/ViewContexts.jsp (original)
+++ webservices/axis2/trunk/java/modules/core/webapp/ViewContexts.jsp Tue Dec 20 07:11:31 2005
@@ -2,7 +2,7 @@
 <%@ page import="org.apache.axis2.context.ConfigurationContext"%>
 <%@ page import="org.apache.axis2.context.ServiceContext"%>
 <%@ page import="org.apache.axis2.context.ServiceGroupContext"%>
-<%@ page import="java.util.HashMap"%>
+<%@ page import="java.util.Hashtable"%>
 <%@ page import="java.util.Iterator"%>
 <%--
   Created by IntelliJ IDEA.
@@ -18,7 +18,7 @@
     ConfigurationContext configContext = (ConfigurationContext)request.getSession().getAttribute(
             Constants.CONFIG_CONTEXT);
 
-    HashMap serviceGroupContextsMap = configContext.getServiceGroupContexts();
+    Hashtable serviceGroupContextsMap = configContext.getServiceGroupContexts();
     Iterator serviceGroupContext = serviceGroupContextsMap.keySet().iterator();
     if(serviceGroupContextsMap.size() >0){
     %>

Modified: webservices/axis2/trunk/java/modules/core/webapp/viewServiceContext.jsp
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/webapp/viewServiceContext.jsp?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/webapp/viewServiceContext.jsp (original)
+++ webservices/axis2/trunk/java/modules/core/webapp/viewServiceContext.jsp Tue Dec 20 07:11:31 2005
@@ -2,7 +2,7 @@
 <%@ page import="org.apache.axis2.context.ConfigurationContext" %>
 <%@ page import="org.apache.axis2.context.ServiceContext" %>
 <%@ page import="org.apache.axis2.context.ServiceGroupContext" %>
-<%@ page import="java.util.HashMap" %>
+<%@ page import="java.util.Hashtable" %>
 <%@ page import="java.util.Iterator" %>
 <%@ page import="java.util.Map" %>
 <%--
@@ -18,7 +18,7 @@
 <h1>Runing Context hierachy</h1>
 <%
     ConfigurationContext configContext = (ConfigurationContext) request.getSession().getAttribute(Constants.CONFIG_CONTEXT);
-    HashMap serviceGroupContextsMap = configContext.getServiceGroupContexts();
+    Hashtable serviceGroupContextsMap = configContext.getServiceGroupContexts();
     String type = request.getParameter("TYPE");
     String sgID = request.getParameter("PID");
     String ID = request.getParameter("ID");

Modified: webservices/axis2/trunk/java/modules/core/webapp/viewServiceGroupContext.jsp
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/webapp/viewServiceGroupContext.jsp?rev=358018&r1=358017&r2=358018&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/webapp/viewServiceGroupContext.jsp (original)
+++ webservices/axis2/trunk/java/modules/core/webapp/viewServiceGroupContext.jsp Tue Dec 20 07:11:31 2005
@@ -1,7 +1,7 @@
 <%@ page import="org.apache.axis2.Constants"%>
 <%@ page import="org.apache.axis2.context.ConfigurationContext"%>
 <%@ page import="org.apache.axis2.context.ServiceGroupContext"%>
-<%@ page import="java.util.HashMap"%>
+<%@ page import="java.util.Hashtable"%>
 <%@ page import="java.util.Iterator"%>
 <%@ page import="java.util.Map"%>
 <%--
@@ -16,7 +16,7 @@
 <h1>Runing Context hierachy</h1>
 <%
     ConfigurationContext configContext = (ConfigurationContext)request.getSession().getAttribute(Constants.CONFIG_CONTEXT);
-    HashMap serviceGroupContextsMap = configContext.getServiceGroupContexts();
+    Hashtable serviceGroupContextsMap = configContext.getServiceGroupContexts();
     String type = request.getParameter("TYPE");
     String sgID = request.getParameter("ID");
     ServiceGroupContext sgContext = (ServiceGroupContext)serviceGroupContextsMap.get(sgID);