To make it clear: the problem is that now Session#invalidate()
prepends the new onDetach() listener and thus is executed before
commitRequest()

On Mon, May 9, 2011 at 3:04 PM, Martin Grigorov <[email protected]> wrote:
> Hi,
>
> Since recently the RequestCycleListeners are executed in reverse order
> for #onDetach() and #onException(). I.e. registered first - notified
> last.
> I'm facing a problem with Session#invalidate(). This method registers
> a listener with #onDetach() which actually invalidates the http
> session and null-ifies the Session#sessionStore.
> In org.apache.wicket.Application.createRequestCycle(Request, Response)
> we register a listener which executes
> org.apache.wicket.page.IPageManager.commitRequest() at the end of each
> request cycle. This listener is setup such way that it is always
> executed as last.
> The problem is:
> - my app calls Session#invalidate() in a callback method (e.g. onClick())
> - later when the listeners are executed Session#invalidateNow() and
> Session#destroy() are called (so the http session and sessionStore are
> destroyed)
> - even later the special listener is executed [1] and :
> -- it re-creates a new http session !
> -- re-uses the same Wicket Session object. See
> https://issues.apache.org/jira/browse/WICKET-3690 for a member which
> leaked. But it will leak even worse if there is user impl of
> WebSession with its own properties.
>
> Am I correct in my investigations ?
>
>
> 1.
> PersistentPageManager$PersitentRequestAdapter(RequestAdapter).bind() line: 80
> PersistentPageManager$PersitentRequestAdapter.getSessionEntry(boolean)
> line: 339
> PersistentPageManager$PersitentRequestAdapter.storeTouchedPages(List<IManageablePage>)
> line: 373
> PersistentPageManager$PersitentRequestAdapter(RequestAdapter).commitRequest()
> line: 185
> PersistentPageManager(AbstractPageManager).commitRequest() line: 94
> PageAccessSynchronizer$1(PageManagerDecorator).commitRequest() line: 68
> PageAccessSynchronizer$1.commitRequest() line: 203
> Application$2.onDetach(RequestCycle) line: 1522
> RequestCycleListenerCollection$3.notify(IRequestCycleListener) line: 100
> RequestCycleListenerCollection$3.notify(Object) line: 95
> RequestCycleListenerCollection(ListenerCollection<T>).reversedNotify(Iterator<T>,
> INotifier<T>) line: 121
> RequestCycleListenerCollection(ListenerCollection<T>).reversedNotify(INotifier<T>)
> line: 112
> RequestCycleListenerCollection.onDetach(RequestCycle) line: 94
> RequestCycle.onDetach() line: 547
> RequestCycle.detach() line: 479
> RequestCycle.processRequestAndDetach() line: 257
> ....
>
> --
> Martin Grigorov
> jWeekend
> Training, Consulting, Development
> http://jWeekend.com
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

Reply via email to