7
votes

GWT, Google App Moteur, TimerSk ou Thread dans ServiceImpl Three Exception

J'utilise le moteur GWT et Google App. J'ai une gamme d'enregistrements et je veux les mettre à jour toutes les 30 minutes. Dans le ServiceImpl em> J'ai le code de fuite:

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)


0 commentaires

5 Réponses :


6
votes

Vous ne pouvez pas - un ouvrier d'arrière-plan implique un fil et une création de fil dans GAE ne fonctionne pas.

La réponse à votre tâche est de ne pas créer de fil ou d'ouvrier de fond, mais d'utiliser ce http://code.google.com/appengine/docs/java/config/cron.html


0 commentaires

0
votes

Voir aussi File d'attente de tâches comme alternative. < / p>


0 commentaires

-1
votes

Le problème n'est pas seulement dans l'App moteur, mais en général dans un conteneur de servlet. Lorsque l'on est dans une méthode de service (que vous êtes toujours dans un conteneur de servlet), vous ne pouvez pas créer de fil et dormir.

Dans le monde des services évolutifs d'aujourd'hui, Thread.Sleep est une mauvaise chose ....


2 commentaires

C'est presque tout à fait faux. Dans un récipient de servlet normal, il est parfaitement possible / souhaitable de créer des threads de fond qui effectuent des actions périodiques. Vous avez raison de dire que Thread.Sleep est mauvais sur le fil de la requête, mais pas sur un fil d'arrière-plan.


Je dois faire écho à @geoff, réclamer des threads et dormir () sont mauvais pour l'évolutivité, c'est tout à fait le contraire de la situation. Le sommeil bien placé est essentiel pour optimiser la puissance de la concurrence. Si vous courez dans un environnement unique, THILL.SLEEP () est une mauvaise idée. Courir n'importe où ailleurs, et c'est le seul moyen d'abandonner le temps de la CPU lorsque vous n'en avez pas besoin et devez attendre des processus asynchrones.



3
votes

Vous êtes monsieur, pourrait bénéficier de la classe ThreadManager de Appengine.

https://developers.google.com/appengine/docs/ Java / Backends / Vue d'ensemble # Background_threads

utiliser threadmanager.CurrentRentreQuestthreadAfactory () pour obtenir une usine de fil qui interrompt les fils engendrés dès que la demande actuelle est terminée, et ThreadManager.backgroundAfactory () pour ponter des threads qui dureront aussi longtemps que vous s'il vous plaît (mais ne fonctionne que sur backends)

Pour les demandes frontales, il est recommandé de garder une trace de vos threads et d'appeler le fil.join () si vous souhaitez qu'ils terminent avant que les filtres de la demande de Appengine n'en interromptent.


1 commentaires

Les retombées ont été obsolètes en faveur des modules; Voir développeurs.google.com/appengine/docs/java/modules/... < / a>.



3
votes

Vous ne pouvez pas utiliser Java.Util.Timer, car il crée un fil ordinaire, qui n'est pas autorisé sur Appengine. Cependant, vous pouvez utiliser l'installation de fil de fond de l'API de modules Appengine, comme indiqué ici: https://developers.google.com/appengine/docs/java/modules/ #Java_background_threads

Notez que vous ne pouvez utiliser que des threads d'arrière-plan sur des instances à l'échelle manuelle. Dans cet exemple, un fil d'arrière-plan imprime un message toutes les 30 secondes, pour toujours: P>

Thread thread = ThreadManager.createBackgroundThread(new Runnable() {
  public void run() {
    try {
      while (true) {
        System.err.println("Doing something!");
        Thread.sleep(30_000);
      }
    } catch (InterruptedException ex) {
    }
  }
});
thread.start();


0 commentaires