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.