remove final from AbstractHttpSessionStore#getSessionId
-------------------------------------------------------

                 Key: WICKET-2950
                 URL: https://issues.apache.org/jira/browse/WICKET-2950
             Project: Wicket
          Issue Type: Wish
          Components: wicket
            Reporter: Peter Ertl


Hi wicket devs!

I am currently working on an own implementation of a wicket failover-safe 
session store.

I know about 
http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit but want 
to get around the session affinity problem and avoid using the one pass 
rendering strategy.

There's still some way to go before my implementation could eventually work. 
However I am facing the problem that a critical method in 
AbstractHttpSessionStore is final.

    public ____final____ String getSessionId(Request request, boolean create)


I am asking you guys if this final could be removed. I don't see much danger 
there or harm that could be done by making this method overridable.

Currently my approach to clustering is like that:

For efficiency's sake someone should use sticky sessions.

Whenever the session changes the delta (only the important parts of the 
session) should be replicated to a memcache instance (other distributed storage 
will work as well).

When a server dies another server will be called through the load balancer and 
should restore the user's session from memcache.

I figured out that the best place to restore a previous session would be 
AbstractHttpSessionStore.getSessionId()

The basic idea is like this:

  MyCustomHttpStoreThatProvidesPrettyFailoverCapabilities.java :-)

@Override
public String getSessionId(Request request, boolean create)
{
        // check if session exists
        String sessionId = super.getSessionId(request, false);

        // no session there, but create required ... this could be a failover 
scenario
        if (sessionId == null && create)
        {
                // save client's requested session id (this should contain the 
id of the lost session before failover)
                WebRequest webRequest = toWebRequest(request);
                String requestedSessionId = 
webRequest.getHttpServletRequest().getRequestedSessionId();

                // create new session
                sessionId = super.getSessionId(request, true);

                // was a previous session id requested?
                if (requestedSessionId != null)
                {
                        String oldKey = memcachePrefix + SESSION_PREFIX + 
requestedSessionId;
                        FailoverSessionInfo savedState = (FailoverSessionInfo) 
memcache.get(oldKey);

                        // check if memcache contains the previous session
                        if (savedState != null)
                        {
                                // store previous session under new session key
                                // (currently storing everything as one state 
instance this is very 
                                //  stupid and simple and obviously needs some 
tuning, 
                                //  e.g. storing only the session delta after 
each request, ...) 
                                memcache.delete(oldKey);
                                memcache.set(memcachePrefix + SESSION_PREFIX + 
sessionId, Integer.MAX_VALUE, savedState);

                                HttpSession httpSession = 
webRequest.getHttpServletRequest().getSession(false);

                                // restore http session from failover storage
                                for (Map.Entry<String, Serializable> entry : 
savedState)
                                        
httpSession.setAttribute(entry.getKey(), entry.getValue());
                        }
                }
        }
        return sessionId;
}

So I would really beg you to remove [final] from 
AbstractHttpSessionStore.getSessionId(..) in 1.4.x and 1.5.x :-)

Best Regards
Peter

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to