Ich versuche, eine TimerTask
-Einstellung einzurichten, um Einträge aus dem Google App Engine-DataStore in regelmäßigen Abständen zu entfernen. Also habe ich einen ServletContextListener
mit einem Timer
eingerichtet.Objectify und TimerTask: Für diesen Thread ist keine API-Umgebung registriert.
Im Inneren des contextInitialized
, ich habe meine Objectify Klassen angemeldet:
ObjectifyService.register(Person.class);
Wenn jedoch die Aufgabe tatsächlich läuft, wirft sie keine API-Umgebung eingerichtet wurde:
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)
Irgendwelche Ideen ? Ich habe versucht, die Zeile zu ändern, die die Klasse auf ObjectifyService.factory().register(Person.class);
registriert, aber es schien nicht zu helfen.
Das hat nichts mit Objectify zu tun hat; Sie werden den gleichen Fehler sehen, wenn Sie eine Anfrage direkt von Ihrem Timer-Thread an die Low-Level-API senden. Ich schlage vor, Sie vereinfachen die Frage, Sie können eine bessere Antwort bekommen. Ich bin wirklich überrascht zu hören, dass Timer in der GAE-Produktion arbeiten (im Gegensatz zum Entwickler). – stickfigure
@stickfigure Ich bin mir nicht sicher, ob sie in der Produktion arbeiten, noch nicht versucht haben, sie hochzuladen. :) –