2009-09-18 5 views
2

J'ai une assez grande application web basée sur la guerre. Lorsque je l'initialise, Tomcat autorise les connexions immédiatement même si l'application n'a pas démarré. Pour cette raison, les utilisateurs obtiennent une page vierge jusqu'à ce que l'application est chargée.Page vierge lors du démarrage d'une grande application Web

J'ai vu certaines applications Web sur lesquelles une page "L'application Web commence, veuillez patienter" pendant le chargement de l'application. Existe-t-il une technique simple pour que les applications Java puissent le faire?

+1

La question est de savoir à quelle fréquence devez-vous démarrer votre application? Je m'attends à ce que, après le démarrage de l'application, il devrait fonctionner correctement jusqu'à la prochaine fois que vous supprimerez le serveur pour maintenance, ce qui ne devrait pas être trop souvent. –

+0

@vincent, c'est vraiment un problème quand on déploie une nouvelle version. J'aimerais avoir des utilisations voir une page plus conviviale plutôt qu'une page blanche. – manalang

Répondre

1

Je suppose que vos servlets font beaucoup d'initialisation dans la méthode init(). Pouvez-vous décharger cela sur un thread séparé, et enregistrer quand ce thread se termine? Vous pouvez fournir un servlet filter qui vérifie la progression de ce thread et interrompre les requêtes (avec un message "please wait") jusqu'à la fin du thread d'initialisation.

+0

+1. 'init()' n'est pas limité à celui de servlet, pourrait être un écouteur de contexte (typique de Spring/autres frameworks) ou un autre filtre. Vous devrez donc faire attention où vous insérez votre filtre ou il ne prendra même pas le contrôle tant que tout n'est pas initialisé. – ChssPly76

+0

On dirait que ce genre de fonctionnalité devrait être intégré au conteneur ... comme si le conteneur affichait une page 503 alors que l'application est toujours en cours de chargement. – manalang

+0

Il semble qu'une certaine initialisation de longue durée ait lieu lors du premier appel à l'application Web, comme peut-être se connecter à une base de données et pré-remplir certaines informations. Ma suggestion serait de déterminer ce qui provoque le retard, puis d'avoir une servlet qui est chargée au démarrage du conteneur commence ce processus d'initialisation. Un champ statique indiquant quand cette initialisation est terminée pourrait être utilisé pour décider d'afficher une page "please wait" ou d'aller directement à l'application web normale. – monceaux

1

Lorsque vous travaillez sur un système complexe, il est très difficile d'éviter une longue attente lors de l'initialisation ou du rechargement. Vous devez aborder cette question de tous les aspects.

Voici quelques conseils de mes propres expériences,

  1. Ne pas effectuer l'initialisation à la demande, comme la connexion à la base de données sur la première demande. Faire tout à l'avant au démarrage de sever.
  2. Pas de statut de gris. C'est soit en hausse soit en initialisation. Tuer le serveur s'il fonctionne partiellement afin que l'équilibreur de charge puisse faire son travail. Envoyez simplement "veuillez patienter" si le statut n'est pas UP.
  3. Effectuez l'initialisation dans ContextListener si vous le pouvez. Servlet.init() ne doit être utilisé que pour des éléments spécifiques à la seule servlet.
  4. Tomcat met en file d'attente les requêtes au démarrage. Vous devez donc effectuer des tâches d'initialisation longues dans un thread différent afin que Tomcat puisse marquer le contexte comme UP et que vous puissiez envoyer ce message "please wait". Nous réduisons également la taille de la file d'attente du connecteur.
  5. L'équilibreur de charge/commutateur doit être configuré sur une page statique "veuillez patienter" quand aucun serveur n'est en marche ou que tous sont trop occupés.
Questions connexes