Hey Jason,

Thanks for the clarification. Unfortunately this leaves me at a loss
for how to elegantly clean up dead sessions and manage logged-in
status. Is the only remaining option to put cleanup scripts into a
cronjob?


On Sep 11, 6:04 pm, "Jason (Google)" <apija...@google.com> wrote:
> Hi Erum. App Engine doesn't support this callback, so when sessionDestroyed
> is triggered by the development server, it's not within an active request
> and hence the exception that you're seeing. In the production environment,
> you would see a similar result if the callback is even triggered at all.
>
> The fact that the development server does trigger sessionDestroyed is a bug
> in the SDK. Please file a new report in our public tracker, and I'm sorry
> for the bad news.
>
> http://code.google.com/p/googleappengine/issues/list
>
> - Jason
>
> On Fri, Sep 11, 2009 at 3:54 PM, Erem <ehb...@gmail.com> wrote:
>
> > Hi Jason,
>
> > Thanks for the response. I'm seeing it in the development environment.
> > I can't even get ahold of a stack trace in production because the
> > logged events I try to throw just aren't reaching the Logs manager. I
> > do know that it's not working, however, because the object doesn't get
> > inserted in the following code.
>
> > Here's some sample code to show what's happening, and a stack trace of
> > the error it throws
>
> > public class SessionListener implements HttpSessionListener {
> >        private static final Logger log = Logger
> >                        .getLogger("DataNucleus.JDO");
> >       �...@override
> >        public void sessionCreated(HttpSessionEvent ev) {
> >                System.out.println("Session starting");
> >                ev.getSession().setMaxInactiveInterval(2);
> >        }
>
> >       �...@override
> >        public void sessionDestroyed(HttpSessionEvent ev) {
> >                try {
> >                        System.out.println("Session ending");
> >                        PersistenceManager pm =
> > PMF.get().getPersistenceManager();
> >                        System.out.println(pm);
> >                        PersistMe me = new PersistMe();
> >                        me.setName("Erem");
> >                        pm.makePersistent(me);
> >                        pm.close();
> >                        System.out.println("Session ended");
> >                } catch (Exception e) {
> >                        log.log(Level.SEVERE, "Failed in session cleanup",
> > e);
> >                }
> >        }
> > }
>
> > This code, when run from the dev server makes this error
>
> > Sep 11, 2009 3:50:53 PM lotr.server.SessionListener sessionDestroyed
> > SEVERE: Failed in session cleanup
> > java.lang.NullPointerException: No API environment is registered for
> > this thread.
> >        at
> > com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId
> > (DatastoreApiHelper.java:63)
> >        at
>
> > com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace
> > (DatastoreApiHelper.java:73)
> >        at com.google.appengine.api.datastore.Key.<init>(Key.java:100)
> >        at com.google.appengine.api.datastore.Key.<init>(Key.java:85)
> >        at com.google.appengine.api.datastore.Key.<init>(Key.java:81)
> >        at com.google.appengine.api.datastore.Entity.<init>(Entity.java:103)
> >        at com.google.appengine.api.datastore.Entity.<init>(Entity.java:84)
> >        at org.datanucleus.store.appengine.DatastoreFieldManager.<init>
> > (DatastoreFieldManager.java:167)
> >        at
> > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject
> > (DatastorePersistenceHandler.java:178)
> >        at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent
> > (JDOStateManagerImpl.java:3185)
> >        at org.datanucleus.state.JDOStateManagerImpl.makePersistent
> > (JDOStateManagerImpl.java:3161)
> >        at org.datanucleus.ObjectManagerImpl.persistObjectInternal
> > (ObjectManagerImpl.java:1298)
> >        at org.datanucleus.ObjectManagerImpl.persistObject
> > (ObjectManagerImpl.java:1175)
> >        at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent
> > (JDOPersistenceManager.java:669)
> >        at org.datanucleus.jdo.JDOPersistenceManager.makePersistent
> > (JDOPersistenceManager.java:694)
> >        at
> > lotr.server.SessionListener.sessionDestroyed(SessionListener.java:
> > 26)
> >        at org.mortbay.jetty.servlet.AbstractSessionManager.removeSession
> > (AbstractSessionManager.java:661)
> >        at org.mortbay.jetty.servlet.AbstractSessionManager$Session.timeout
> > (AbstractSessionManager.java:918)
> >        at org.mortbay.jetty.servlet.HashSessionManager.scavenge
> > (HashSessionManager.java:200)
> >        at org.mortbay.jetty.servlet.HashSessionManager.access$000
> > (HashSessionManager.java:36)
> >        at org.mortbay.jetty.servlet.HashSessionManager$1.run
> > (HashSessionManager.java:144)
> >        at java.util.TimerThread.mainLoop(Unknown Source)
> >        at java.util.TimerThread.run(Unknown Source)
>
> > On Sep 11, 11:37 am, "Jason (Google)" <apija...@google.com> wrote:
> > > Hi Erum. Are you seeing this error in the development environment or in
> > > production?
>
> > > - Jason
>
> > > On Wed, Sep 9, 2009 at 5:43 PM, Erem <ehb...@gmail.com> wrote:
>
> > > > Hey All,
>
> > > > What is the best way to tie into session destruction events?
>
> > > > I have implemented an HttpSessionListener and put it in my web.xml.
> > > > The SessionListener gets called, but any attempt to do DataStore or
> > > > URLFetch API calls within sessionDestroyed results in errors.
>
> > > > For example, the JDO API throws:
>
> > > > Exception in thread "Timer-125" java.lang.NullPointerException: No API
> > > > environment is registered for this thread.
> > > >        at
> > > > com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId
> > > > (DatastoreApiHelper.java:63)
> > > >        at
> > com.google.appengine.api.datastore.QueryTranslator.convertToPb
> > > > (QueryTranslator.java:35)
>
> > > > My app has constructs of "Visitors" (anyone who comes to the site) and
> > > > "Users" (verified accounts). The former's data get stored in sessions,
> > > > the latter explicitly in the datastore.
>
> > > > Every User has an ArrayList<Visitor>, listing the visitors currently
> > > > logged in to the User's account.
>
> > > > When a session is destroyed, meaning a Visitor has left, I want to
> > > > remove that visitor from the user's "Logged in" ArrayList.
>
> > > > Having trouble thinking of another way to do it =(
>
> > > > Any advice would be much appreciated.
>
> > > > Erem
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-java@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to