[ http://issues.apache.org/jira/browse/AXIS-2314?page=all ]
     
Davanum Srinivas resolved AXIS-2314:
------------------------------------

    Resolution: Fixed

Checked in the last patch with WeakHashMap :)

thanks,
dims

> Axis leaking Session objects
> ----------------------------
>
>          Key: AXIS-2314
>          URL: http://issues.apache.org/jira/browse/AXIS-2314
>      Project: Apache Axis
>         Type: Bug
>   Components: Basic Architecture
>     Versions: 1.3
>  Environment: Tomcat 5.5.12; JDK 1.4.0, 1.4.2, and 1.5; Windows XP Pro and 
> Solaris 9
>     Reporter: Ben Gunter
>  Attachments: SOAPService.java-Axis_1.3.patch, 
> SOAPService.java-Axis_1.3.patch, SimpleSessionHandler.java-Axis_1.3.patch
>
> I have deployed a session-scoped service using the SimpleSessionHandler.  I 
> discovered the hard way that SimpleSession objects are not being  recovered 
> by the garbage collector and after some research found the root of the 
> problem.
> It seems that each org.apache.axis.handlers.soap.SOAPService object maintains 
> a Vector of active sessions associated with it.  Likewise, each 
> org.apache.axis.handlers.SimpleSessionHandler maintains a Hashtable mapping 
> session IDs to SimpleSession objects.  The SimpleSessionHandler's reaping 
> mechanism works properly, cleaning up stale sessions by removing them from 
> the activeSessions Hashtable after they've timed out.  The problem is that 
> SOAPService has no such mechanism, and in fact provides no public method to 
> remove Sessions from its own private Vector of active
> sessions.  (Incidentally, even clearSessions() doesn't free the sessions up, 
> just removes an attribute from each of them.)
> To complicate matters further, when the SimpleSessionHandler removes a 
> Session from activeSessions, it does not call invalidate() on the session so 
> any properties that have been set on the Session are still referenced by the 
> Session, which is still referenced by the SOAPService object.  This can cause 
> some major problems -- in my case a file handle leak that forced a restart 
> about every hour.
> I'm sure there's more than one way to correct the problem, but I took two 
> simple steps.  First, I added a public removeSession() method to SOAPService, 
> like so:
>    /**
>     * Remove the given session from its known sessions
>     */
>    public void removeSession(Session session) {
>      session.remove( this.getName() );
>      Vector v = (Vector) sessions.get( this.getName() );
>      if ( v != null ) v.remove( session );
>    }
> And then I inserted a few lines into SimpleSessionHandler's invoke() method, 
> like so:
> (At line 25)
> import org.apache.axis.handlers.soap.SOAPService;
> ...
> (At line 137)
>            SOAPService service = context.getService();
> ...
> (At line 155)
>                if (service != null)
>                        service.removeSession(session);
> Hopefully those line numbers haven't been changed by a formatter or 
> something.  I'll attach the output of diff -u if I can figure out how.
> My testing shows that with this change in place, the Sessions and all of 
> their properties get cleaned up properly.  I don't, however, know if this 
> will have some ill side effects that I'm not aware of.  I'll let you folks 
> determine that, since you know much more about the code than I do.
> What might be a better solution would be for SOAPService to maintain a list 
> of weak references to the sessions instead of strong references.  Then the 
> only thing that would need to change would be a few null checks here and 
> there.
> If SOAPService absolutely must maintain a reference to every Session ever 
> associated with it, then at a minimum the SimpleSessionHandler must call 
> Session.invalidate() on expired sessions, which frees all the properties of 
> the Session.  My testing showed that would prevent major problems, but that 
> the Session objects themselves still don't get freed.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to