Selon le lien http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20 , l’un des motifs d’appel de la méthode destroy est lorsque le servlet n’a pas Vous n'avez pas reçu de demande depuis longtemps .
Je pensais que certaines pages pourraient ne pas être appelées avant longtemps. Alors, est-ce que cela signifie que détruire sera appelé et qu'ils ne seront plus utilisés?
En fait, on m'a posé cette question en entrevue et il m'a dit que la méthode de destruction ne sera appelée que lorsque le serveur sera arrêté.
Appréciez toute aide à ce sujet.
AUTANT QUE JE SACHE,
Dans le servlet Java, destroy()
n'est pas censé être appelé par le programmeur. Mais, s'il est appelé, il est exécuté. La question implicite est la suivante: le servlet sera-t-il détruit? Non, ça ne va pas. La méthode destroy()
n'est pas censée détruire un servlet Java.
La signification de destroy()
dans le servlet Java est que le contenu est exécuté juste avant que le conteneur décide de détruire le servlet. Mais si vous appelez vous-même la méthode destroy()
, le contenu est simplement exécuté et le processus respectif continue. En ce qui concerne cette question, la fonction destroy()
est exécutée, puis l'initialisation du servlet est terminée.
La méthode destroy()
est d'abord appelée, puis Servlet est retiré du conteneur, puis les ordures sont collectées. La méthode destroy()
contient généralement du code permettant de libérer des ressources telles que la connexion JDBC qui ne seront pas mises au rebut.
Couple de cas:
Selon le doc
Appelé par le conteneur de servlet pour indiquer à un servlet que le servlet est mis hors service. Cette méthode n'est appelée qu'une fois que tous les threads de la méthode de service de la servlet se sont terminés ou qu'un délai a expiré. Une fois que le conteneur de servlet a appelé cette méthode, il n'appellera plus la méthode de service sur ce servlet.
A partir de la spécification (The Servlet Interface -> Servlet Life Cycle -> End of Service
):
Une fois que la méthode destroy est appelée sur une instance de servlet, le conteneur ne peut plus acheminer d'autres demandes à cette instance du servlet. Si le conteneur doit réactiver le servlet, il doit le faire avec une nouvelle instance de la classe du servlet.
La spécification fait référence à une instance particulière de la servlet en cours de destruction.
Alors, est-ce que cela signifie que détruire sera appelé et qu'ils ne seront plus utilisés?
Cela ne signifie pas que la servlet dont l'instance est détruite n'est jamais utilisée. Seule cette instance particulière n'est pas utilisée car elle aurait été collectée. Lorsqu'une demande arrive pour ce servlet, le conteneur crée une nouvelle instance de ce servlet et exécute toutes les actions de cycle de vie jusqu'au traitement de la demande.
C'est l'une de ces choses classiques contre l'implémentation. La spécification autorise les conteneurs de servlet tels que Tomcat à gérer un pool d'objets Servlet, en les créant et en les détruisant au fur et à mesure que la charge augmente ou diminue. Dans ce type de configuration, destroy est appelé lorsque l'instance particulière n'est plus nécessaire. Il serait même légal de créer une nouvelle instance pour chaque requête, en appelant init immédiatement avant que la requête soit traitée et détruite immédiatement après.
Cependant, dans la pratique, pratiquement chaque conteneur Servlet gère exactement une instance de chaque Servlet. Etant donné que les servlets doivent être thread-safe, cela convient également parfaitement. Dans ce scénario, destroy n'est appelé que lorsque le contexte est arrêté.
Je ne peux pas penser à de nombreux cas où vous voudriez mettre en commun les Servlets, mais cela est autorisé par la spécification.
La méthode de destruction de Servlet est un rappel. Ce sont les fonctions appelées par le conteneur lorsqu'un événement particulier est sur le point de se produire (dans ce cas, le servlet sur le point d'être détruit). Par conséquent, si vous voulez faire quelque chose (par exemple, nettoyer la ressource), vous pouvez faire ce qui est sous ce rappel.
La javadoc de Servlet.destroy () dit: "Appelé par le conteneur de servlets pour indiquer à un servlet que le servlet est mis hors service". Il ne spécifie pas dans quelles situations un servlet pourrait être "mis hors service", il s'agit simplement d'un événement auquel vous pouvez réagir si vous en avez besoin. Par exemple, vous voudrez peut-être fermer certaines ressources que vous avez ouvertes ou conserver un état au stockage.
La raison la plus évidente est que le conteneur de servlets est en cours de fermeture, mais un conteneur peut également décider qu'il est temps de décharger un servlet car il n'a pas été utilisé depuis un mois et consomme simplement des ressources. Ce comportement dépend entièrement de la mise en œuvre et ne doit pas vous préoccuper (en tant que concepteur de servlet).
Cela dépend totalement de l'implémentation du conteneur de servlets que vous utilisez. Si votre conteneur de servlet est très prudent en matière d'économie de ressources, il peut détruire le servlet qui n'est pas en service pendant longtemps.
Dans la page 22 de la spécification de servlet 2.5, vous constaterez que, "Lorsque le conteneur de servlet détermine qu’un servlet doit être supprimé du service, il appelle la méthode destroy de son interface pour lui permettre de libérer toutes les ressources qu’il utilise et de les sauvegarder. tout état persistant. Par exemple, le conteneur peut effectuer cette opération s’il souhaite conserver les ressources en mémoire ou s’il est en cours d’arrêt. "
De la spécification Servlet: -
la méthode destroy () est appelée par le conteneur de servlet pour indiquer à un servlet que le servlet est mis hors service. Cette méthode n'est appelée qu'une fois que tous les threads de la méthode de service de la servlet se sont terminés ou qu'un délai a expiré. Après l'appel de la méthode destroy () par le conteneur de servlet, il n'appellera plus la méthode de service sur "THIS SERVLET".
Le conteneur de servlet n'est pas obligé de garder un servlet chargé pendant une période donnée. Une instance de servlet peut être maintenue active dans un conteneur de servlets pendant une période de quelques millisecondes, pendant toute la durée de vie du conteneur de servlet (ce qui peut prendre plusieurs jours, mois ou années) ou à une durée intermédiaire.
Lorsque le conteneur de servlet détermine qu'un servlet doit être supprimé du service, il appelle la méthode destroy de l'interface Servlet afin de permettre au servlet de libérer toutes les ressources qu'il utilise et d'enregistrer tout état persistant. Par exemple, le conteneur peut effectuer cette opération lorsqu'il souhaite conserver des ressources de mémoire ou lorsqu'il est en cours de fermeture.
Avant que le conteneur de servlet appelle la méthode destroy, il doit permettre à tous les threads en cours d'exécution dans la méthode service du servlet de s'exécuter ou de dépasser la limite de temps définie par le serveur.
Une fois que la méthode destroy est appelée sur une instance de servlet, le conteneur ne peut plus acheminer d'autres demandes à cette instance du servlet.