I can't answer your specific question, but as an alternative approach
(and not tied to Tapestry) you could implement an HttpSessionListener,
like this (and configure it in your web.xml):

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.log4j.Logger;

public class SessionListener implements HttpSessionListener
{
    private static final Logger logger =
Logger.getLogger(SessionListener.class);
    private static int currentSessions = 0;
    private static int totalSessions  = 0;

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        currentSessions++;
        totalSessions++;
        logger.info("Session created: current sessions = " +
currentSessions + "; sessions since app started = " + totalSessions);
    }
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        currentSessions--;
        logger.info("Session destroyed: current sessions = " +
currentSessions + "; sessions since app started = " + totalSessions);
    }
}

Your sessionDestroyed() method is called just *before* the session is
invalidated (e.g. from a timeout).


On Sun, Sep 23, 2012 at 9:58 AM, Matías Blasi <matias.bl...@gmail.com> wrote:
> Hi all,
>
> I'm trying to implement a mechanism to track each user session, at least
> the login and logout events.
> The login is easy, because it occurs in a defined place, but the logout can
> occurs explicitly or because of a timeout, so I thought in advising the
> Tapestry Session.invalidate() method:
>
>     @SuppressWarnings("unchecked")
> @Advise(serviceInterface=org.apache.tapestry5.services.Session.class)
>     public static void adviseUserActivity(final UserService userService,
> final MethodAdviceReceiver receiver)
>     throws SecurityException, NoSuchMethodException {
>     MethodAdvice advise = new MethodAdvice() {
> @Override
> public void advise(MethodInvocation invocation) {
> userService.endSession(userService.getCurrentUser().getUserName());
> }
>     };
>
>
>   receiver.adviseMethod(receiver.getInterface().getMethod("invalidate"),
> advise);
>     }
>
> But oddly, I'm getting the following error when starting up the application:
>
> Caused by: java.lang.RuntimeException: Error invoking method public static
> void
> com.app.services.AppModule.adviseUserActivity(com.app.core.services.UserService,org.apache.tapestry5.ioc.MethodAdviceReceiver)
> throws java.lang.SecurityException,java.lang.NoSuchMethodException:
> org.hibernate.Session.invalidate()
>         at
> org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:61)
>         at
> org.apache.tapestry5.ioc.internal.util.LoggingInvokableWrapper.invoke(LoggingInvokableWrapper.java:42)
>         at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74)
>         ... 79 more
> Caused by: java.lang.NoSuchMethodException:
> org.hibernate.Session.invalidate()
>         at java.lang.Class.getMethod(Class.java:1622)
>         at com.app.services.AppModule.adviseUserActivity(AppModule.java:198)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>         at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:616)
>         at
> org.apache.tapestry5.ioc.internal.util.MethodInvoker.invoke(MethodInvoker.java:50)
>         ... 81 more
> 2012-09-23 10:50:11.134::INFO:  Started SelectChannelConnector@0.0.0.0:8080
> [INFO] Started Jetty Server
>
> Why is it trying to advise the org.hibernate.Sesssion.invalidate() method
> if I explicitly
> annotated: 
> @Advise(serviceInterface=org.apache.tapestry5.services.Session.class),
> is it a bug?
>
> Anyway, do you think this is the best way of doing this, or is there any
> other better mechanism to intercept a finished session?
>
> Best regards,
> Matias.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to