You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Jochen Kuhnle <li...@kuhnle.net> on 2005/05/14 02:36:10 UTC
Context/Session/Request lifecycle listeners? (Getting rid of synchronized(session))
For many Cocoon applications, there is the need to initialize Context,
Session and Request (C/R/S) attributes, e.g. with database connections,
and dispose those attributes after use so there are no leaks. Right now,
there are several methods for hooking into C/R/S creation and destruction:
ServletContextListener and HttpSessionListener from the Servlet API for
Requests and Sessions, using o.a.c.RequestListener for Requests or even
subclassing the Cocoon Servlet. This has several disadvantages:
1. It's ugly. You use different APIs (Cocoon and Servlet API) to achieve
similar goals. When you're done, you don't have a Cocoon application, you
have a Cocoon & Servlet container application. What about an easy switch
to Cocoon's 'batch mode'?
2. It's not that easy to access the Cocoon API from the servlet API
functions. For example, ServletContextListener.contextInitialized is
called before the Cocoon servlet is initialized. This means there's no
ComponentManager available, so no access to Avalon/Cocoon components if
you need them to initialize the session.
3. Although the order of calls is well defined (at least I hope so :), it
still takes more time to figure out than a common API with a well-defined
contract.
4. Lazy initialization of session and context attributes depends on
synchronization (mainly done on the session and context objects) which
poses its own problems, as seen in [1]. When there's a defined
initialization hook before the C/R/S goes to work, you don't need
synchronization. And when you need lazy initialization, you can use a
lightweight proxy object. When you create the proxied heavyweight, you can
synchronize on the proxy instead of the whole session or even context.
How about introducing C/R/S listeners in Cocoon that are notified of
creation and destruction events? Something like
Cocoon.addSessionListener(SessionListener)? Since this would make my life
easier, too, I would gladly help to write it...
Regards,
Jochen
[1] http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=111574488018276&w=2