It's worth noting that session data isn't cleaned up by default.  This means
that you can implement your own session cleanup logic and perform any other
cleanup logic hat you need to do at the same time.

On Mon, Sep 14, 2009 at 5:50 PM, Jason (Google) <apija...@google.com> wrote:

> Yes, this seems reasonable. You can run this job, hitting the cleanup
> servlet, once a day or any interval you see fit.
>
> For more info:
> http://groups.google.com/group/google-appengine-java/browse_thread/thread/4f0d9af1c633d39a
>
> - Jason
>
>
> On Fri, Sep 11, 2009 at 6:45 PM, Erem <ehb...@gmail.com> wrote:
>
>>
>> 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