2009-10-04 8 views
1

J'ai actuellement une application web où j'ai des servlets qui lisent et écrivent sur les attributs ServletContext et j'ai des threads "fonctionnants" (threads Daemon)) qui sont initialisés au démarrage et qui contiennent actuellement en tant que membre l'objet ServletContext. Pour une raison ou une autre, je pense plutôt à "implémenter Runnable" et je suis coincé avec le fait que j'ai besoin d'une ressource commune que les servlets et les non-servlets peuvent utiliser pour communiquer entre eux et je sens Je suis un peu coincé dans le paradigme ServletContext. Je vous serais reconnaissant si quelqu'un pouvait fournir des points sur la façon d'utiliser le ServletContext (mon chemin ou d'une autre manière) et aussi je pense juste utiliser une classe singleton qui sera initialisée au démarrage et sera thread sûr et je ' Je vais juste acheminer toutes les communications des servlets et des non-servlets à travers elle. Que pensez-vous?Pourquoi utiliser l'objet ServletContext dans une application web contenant des servlets et des threads "worker" en Java

Merci

+0

La "bonne façon" dépend de ce que ces threads sont censés faire. De quoi avez-vous besoin pour le 'ServletContext'? – BalusC

+0

Salut BalusC, merci pour votre commentaire. Le ServletContex a été utilisé comme une sorte de référentiel central de données. – Ittai

Répondre

7

conteneur de servlets Java est effectivement un conteneur de code légèrement géré. Les servlets sont des composants avec un cycle de vie très bien défini, et il existe également un contrat très bien défini entre le conteneur et les composants (qui peuvent également inclure des filtres). Comme il est spécifié, une application Web est un système passif-réactif.

Il est passif, en ce sens qu'aucun thread défini par l'utilisateur n'est (strictement) autorisé. (Certains conteneurs ne peuvent pas appliquer cette restriction, mais en engendrant vos propres threads, vous êtes effectivement hors de la réservation, et des comportements potentiellement imprévisibles peuvent se produire.)

Il est réactif, en ce sens que l'activité sur le serveur (en votre base de code) se produit en réponse à des demandes, et ce pour les demandes HTTP typiques de l'application Servlet. Le ServletContext est le contexte partagé de tous les composants d'une application Web donnée dans le conteneur. Ce contexte est créé lorsque l'application Web est activée et détruite lorsqu'elle est désactivée. Vous pouvez utiliser un composant ServletContextListener pour vous connecter à ce cycle de vie et recevoir des rappels de notification concernant les événements du cycle de vie.

Si vous êtes prêt à continuer sur le côté sauvage et se reproduire hors éléments actifs dans votre web-app, vous voudrez peut-être considérer les points suivants:

1 - Créez et enregistrez un composant ServletContextListner pour gérer l'actif Composants. Au démarrage/à l'activation de l'application web, vous recevrez un rappel du conteneur. Ici vous pouvez démarrer vos composants filetés. Comme ce composant sera passé une référence au ServletContext, vous pouvez transmettre cette référence aux composants filetés. 2 - Votre classe de composants filetés (que ce soit une extension de Thread ou une implémentation de Runnable) doit être gérable, dans le sens où vous devez fournir les moyens d'arrêter proprement le thread lorsque votre ServletContextListener reçoit le rappel d'arrêt de contexte. Si vous êtes prêt à formaliser les tâches exécutables, le ExecutorService vous offre les fonctionnalités dont vous avez besoin pour ne pas avoir à réinventer la roue. Cela dit, vous voudrez peut-être revoir vos exigences et donc la conception et la plate-forme de conteneur Web que vous avez choisie. Il se peut que vous ayez vraiment besoin d'une pile dorsale plus sophistiquée.

+0

Hi alphazero, je suis désolé mais je pense que vous ne répondez pas vraiment à ma question en ce sens que mon principal dilemme était quelle ressource commune devrais-je utiliser entre les servlets? et les non-servlets? Je suis actuellement penché sur l'utilisation d'une classe 'Singleton' comme une imitation de' ServletContext', donc je n'aurai pas besoin de l'horrible hack pour passer le 'ServletContext' partout. (BTW, je suis déjà en train de mettre en œuvre la plupart de vos recommandations qui fait partie de la raison pour laquelle j'ai répondu que je ne répondais pas vraiment à ma question) – Ittai

+0

Je pensais qu'il était clair d'après la réponse qu'il n'y a pas de ressource partagée/commune en dehors de les limites des conteneurs, sauf si vous commencez à regarder d'autres API de pile JEE, comme JNDI, JDBC, etc. L'utilisation de Singleton dans les conteneurs est une très mauvaise idée étant donné que vous n'avez aucun contrôle sur la hiérarchie du classloader et que le modèle singleton suppose un chargeur de classe partagé hiérarchie. – alphazero

Questions connexes