2011-06-09 3 views
1

J'héberge mon application sur google app engine. Ce que mon application doit faire est de se connecter toutes les deux minutes à un site Web, de l'analyser et d'envoyer les informations nécessaires à mon appareil en utilisant C2DM. J'ai d'abord testé mon application pour voir si cela fonctionne une fois. Et ça fonctionne bien. Mais pour vérifier le webiste toutes les deux minutes, je mets les méthodes nécessaires dans une boucle while, puis je mets Thread.sleep (120000) dans la boucle while. Il a wokred pendant un moment mais maintenant je reçois ceci: Exception non interceptée de servlet com.google.apphosting.runtime.HardDeadlineExceededError: Cette demande (f6b9f0b8e1ec6f23) a commencé à 2011/06/09 10: 24: 22.514 UTC et était toujours en cours d'exécution à 2011/06/09 10: 24: 52.824 UTC. Donc, avant la chose de deux minutes, tout était OK.google app engine HardDeadlineExceededError

ce qui est tout le message d'erreur:

Uncaught exception from servlet 
com.google.apphosting.runtime.HardDeadlineExceededError: This request (f6b9f0b8e1ec6f23) started at 2011/06/09 10:24:22.514 UTC and was still executing at 2011/06/09 10:24:52.824 UTC. 

at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:408) 
at java.lang.StringBuilder.append(StringBuilder.java:136) 
at java.lang.StringBuilder.<init>(StringBuilder.java:110) 
at tripplannerServer.ParseVerstoring.parsePlanned(ParseVerstoring.java:50) 
at tripplannerServer.SendMessage2.geplandeVerstoring(SendMessage2.java:257) 
at tripplannerServer.TripplannerServerServlet.doGet(TripplannerServerServlet.java:152) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) 
at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260) 
at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9669) 
at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:439) 
at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:688) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:636) 

Toute idée comment résoudre ce problème? Ou l'idée d'utiliser Thread.sleep() n'est pas bonne? Sinon comment puis-je faire l'application vérifier le site Web toutes les deux minutes?

Merci d'avance.

Répondre

4

Toute application frontale devrait être terminée en 30 secondes (HardDeadline). Vous avez essentiellement 2 options,

  1. (meilleur) changez la logique de votre application, évitez Thread.sleep() et utilisez cron.xml à la place pour démarrer votre application toutes les x minutes. Dans votre cas, always-on ou taskQueue n'aidera pas.
  2. passez à Backends afin de pouvoir exécuter votre application en continu.
+0

Nous vous remercions de votre réponse. Dois-je réécrire mon code à partir de rien pour que ce cron.xml fonctionne ou simplement intégrer le cron dans mon application existante? Je suppose que Google me facture pour l'utilisation de Backends, non? Je pose ces questions parce que je n'ai jamais entendu parler de cron.xml ou Backends – mnish

+0

@mnish L'application dans crom.xml est simplement une servlet. Je suppose que vous avez juste besoin de supprimer sleep() et loop pour créer un sevlet pour une seule course. Cochez [link] (http://code.google.com/appengine/docs/java/configyaml/cron.html) pour plus de détails sur cron.xml. – ShuaiYuan

6

Vous ne devez jamais utiliser Thread.sleep dans une requête frontale, une file d'attente de tâches ou une requête cron App Engine. Au lieu de cela, planifiez un travail cron toutes les deux minutes ou enchaînez les tâches Task Queue avec les ETA appropriées.

2

nous obtenons un tel type d'erreur lorsque le temps de récupération dépasse 60 secondes.

Pour résoudre ce problème, google app engine prend en charge le "curseur". En utilisant le curseur, vous pouvez fixer la limite fetching,

si nécessaire, vous pouvez ensuite mettre en œuvre le curseur interne également à savoir (curseur à l'intérieur du curseur)

0

J'ai eu ce problème que la première fois que j'essaie de charger ma page web après avoir déployé mon code en production. Ce premier chargement a pris beaucoup de temps et j'ai donc eu l'erreur. Ce qui a fonctionné pour moi était de changer la classe de classe d'instance frontale dans la performance dans mes paramètres d'application (sous le menu d'administration). Je suis passé de F1 à F2 et le problème a été résolu.

Une fois ce premier chargement terminé, je reviens à F1, car avec les autres options, vous consommez beaucoup plus de quotas d'instances frontales.