Próbuję skonfigurować system TimerTask
, aby okresowo usuwać wpisy z magazynu danych Google App Engine. Dlatego skonfigurowałem ServletContextListener
z Timer
.Objectify i TimerTask: Nie zarejestrowano środowiska API dla tego wątku.
Wewnątrz contextInitialized
, Zarejestrowałem moje zajęcia zobiektywizować:
ObjectifyService.register(Person.class);
Jednak, gdy zadanie faktycznie działa, to twierdzi, że nie środowisko API został ustanowiony:
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)
pomysłów ? Próbowałem zmienić linię, która rejestruje klasę na ObjectifyService.factory().register(Person.class);
, ale nie pomagało.
To nie ma nic wspólnego z zobiektywizować; zobaczysz ten sam błąd, jeśli wyślesz zapytanie bezpośrednio do interfejsu API niskiego poziomu z wątku licznika czasu. Sugeruję, abyś uprościł pytanie, możesz uzyskać lepszą odpowiedź. Jestem naprawdę zaskoczony, że Timers pracuje w produkcji GAE (w przeciwieństwie do dev). – stickfigure
@stickfigure Nie jestem pewien, czy działają w produkcji, jeszcze nie próbowałem go przesłać. :) –