Sto tentando di ottenere un TimerTask
impostato per rimuovere periodicamente le voci dal dataStore di Google App Engine. Così ho creato uno ServletContextListener
con uno Timer
.Objectify e TimerTask: Nessun ambiente API è registrato per questo thread
All'interno del contextInitialized
, ho registrato le mie classi oggettivare:
ObjectifyService.register(Person.class);
Tuttavia, quando l'attività viene eseguita in realtà, si lamenta del fatto che nessun ambiente di API è stato istituito:
Exception in thread "Timer-0" java.lang.NullPointerException: No API environment is registered for this thread.
at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:80)
at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:90)
at com.google.appengine.api.datastore.Query.<init>(Query.java:214)
at com.google.appengine.api.datastore.Query.<init>(Query.java:143)
at com.googlecode.objectify.impl.cmd.QueryImpl.<init>(QueryImpl.java:72)
at com.googlecode.objectify.impl.cmd.LoadTypeImpl.createQuery(LoadTypeImpl.java:50)
at com.googlecode.objectify.impl.cmd.LoadTypeImpl.filter(LoadTypeImpl.java:58)
at myApp.MyServletContextListener$MyTask.run(MyServletContextListener.java:58)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Tutte le idee ? Ho provato a cambiare la linea che registra la classe su ObjectifyService.factory().register(Person.class);
ma non sembra essere di aiuto.
Questo non ha nulla a che fare con oggettivare; vedrai lo stesso errore se invii una query direttamente all'API di basso livello dal tuo thread del timer. Ti suggerisco di semplificare la domanda, potresti ottenere una risposta migliore. Sono davvero sorpreso di sentire che i timer funzionano nella produzione di GAE (al contrario di dev). – stickfigure
@stickfigure Non sono sicuro che funzionino in produzione, non abbiamo ancora provato a caricarlo. :) –