GWT, Google App Engine, TimerTask oder Thread in ServiceImpl Ausnahme auslösen
Ich bin mit GWT und die Google App Engine. Ich habe array von Datensätzen und ich möchte aktualisieren Sie alle 30 Minuten.
In der ServiceImpl ich habe die Stilllegung code :
new Timer().schedule(new TimerTask(){
@Override
public void run() {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result = updateFeeds();
}
}, 30000,Long.MAX_VALUE);
Wenn ich die Anwendung ausführen und wenn ich Sie bekommen :
com.google.gwt.user.server.rpc.UnexpectedException:
Service method 'public abstract java.util.List org.joke.planet.client.FeedService.loadFeeds()' threw an unexpected exception:
java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)
in der ersten Zeile oder eingefügten code.
Meine Frage ist, WIE kann ich das hintergrund-Arbeiter, die in GWT+AppEngine-Service ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden java.util.Timer, denn es sorgt für einen ordentlichen thread, das ist nicht erlaubt auf der AppEngine. Allerdings können Sie mit der AppEngine-Module-API-Hintergrund-thread-Anlage, wie hier beschrieben:
https://developers.google.com/appengine/docs/java/modules/#Java_Background_threads
Beachten Sie, dass Sie nur mit hintergrund-threads auf manuell skalierten Instanzen. In diesem Beispiel wird ein hintergrund-thread, druckt eine Nachricht alle 30 Sekunden für immer:
können Sie nicht - eine im hintergrund laufende impliziert einen thread und thread-Erstellung im Spiel funktioniert nicht.
Die Antwort auf Ihre Aufgabe besteht nicht darin, einen thread oder im hintergrund laufende, aber um diese zu verwenden http://code.google.com/appengine/docs/java/config/cron.html
Ihnen, sir, könnten davon profitieren, appengine ist newish ThreadManager-Klasse.
https://developers.google.com/appengine/docs/java/backends/overview#background_threads
Verwenden ThreadManager.currentRequestThreadFactory() um einen Thread Fabrik, die interrupt erzeugt threads, sobald die aktuelle Anforderung abgeschlossen ist, und ThreadManager.backgroundThreadFactory (), um zu laichen threads, die für die letzten so lange, wie du willst (aber nur funktioniert auf backends)
Für frontend-Anforderungen, es wird empfohlen, um zu verfolgen Sie Ihre Themen, und rufen thread.join() wenn Sie wollen, Sie zu beenden, bevor appengine Antrag filter unterbricht Sie.
Siehe auch task queues als alternative.
Liegt das Problem nicht nur in der App engine, aber im Allgemeinen in einem beliebigen Servlet-container. Wenn man in einer service-Methode (die Sie immer in der Servlet-container), können Sie nicht erstellen threads und tun schläft.
In der heutigen skalierbare service-Welt thread.schlafen ist eine schlechte Sache....