2010-02-10 20 views
0

À chaque fois que je lance mon application sur le serveur de développement, il semble que l'on se bloque. Je ne suis pas sûr si cela bloque également sur le serveur de production. Je fais une pause les threads et vois que l'un d'eux est bloqué à Permissions.implies: 162 qui est le début d'un bloc synchronized.Google App Engine - Impasse?

Qu'est-ce que mon code est fait: sur la page d'accueil, il envoie 5 demandes de jquery en même temps à mon servlet InitServlet qui a la méthode servicesynchronized. Chaque fois que la méthode de service est utilisée, un composant différent est initialisé, chacun prenant environ 2 secondes pour s'initialiser. Peu importe l'ordre dans lequel les threads atteignent la méthode de service, et cela ne se produit que 5 fois, au moment du démarrage du serveur, donc je pense qu'il devrait être bon de synchroniser la méthode de service.

Des suggestions sur la façon de résoudre ce blocage, ou quelqu'un sait-il si c'est juste un bug avec le serveur de développement?

EDIT: Déterminé où le blocage se produit, ne sais toujours pas pourquoi. À l'intérieur du verrou pour Permissions.implies, un thread appelle Class.getDeclaredConstructors0 et n'en renvoie jamais. Un autre thread attend d'acquérir le verrou sur Permissions.implies. Le premier thread qui se bloque sur getDeclaredConstructors0, effectue l'initialisation de classe pour la classe PersistenceManagerFactory standard prise à partir des exemples de documents GAE.

Répondre

1

Vous ne devez pas utiliser les demandes d'initialisation de votre application comme ceci: Les instances d'une application App Engine peuvent être démarrées ou arrêtées à tout moment, et App Engine générera plusieurs instances simultanées pour gérer les demandes à tout moment. taux, de sorte que différentes machines virtuelles puissent avoir des sous-ensembles différents des appels d'initialisation.

+0

Oui, c'est le genre de piratage que j'ai fait pour que le temps de démarrage à froid de mon moteur d'application soit réduit à 3 secondes au lieu de 10 secondes. JDO prend un peu de temps pour initialiser, ~ 2 secondes pour getPersistenceManagerFactory, et pour moi environ 3 secondes sur la première requête que je fais car il construit des métadonnées sur les classes du modèle ou quelque chose. De plus, j'utilise openid4java qui a également un temps de démarrage important. Donc, ce que je fais est jusqu'à ce que l'initialisation soit terminée, je sers juste des pages directement dans le memcache si je peux. – Kyle

+0

Si seulement App Engine prenait en charge cette demande de fonctionnalité -http: //code.google.com/p/googleappengine/issues/detail? Id = 2690. Ensuite, je n'aurais pas à m'inquiéter des heures de démarrage à froid, et je n'aurais pas à passer beaucoup de temps à optimiser mon heure de démarrage à froid. Parce que, comme c'est le cas actuellement, il semble que même avec un bon flux de trafic, il y aura toujours des demandes de chargement pour certains utilisateurs (par exemple lorsqu'une deuxième ou une troisième instance JVM démarre). – Kyle