You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Christopher Schultz <ch...@christopherschultz.net> on 2025/01/02 18:34:49 UTC
Re: (errata corige) contextDestoryed events order of calling
Ivano,
On 12/31/24 3:56 AM, Ivano Luberti wrote:
> Chris
>
> Il 27-Dec-24 19:18, Christopher Schultz ha scritto:
>> Ivano,
>>
>> On 12/27/24 12:48 PM, Ivano Luberti wrote:
>>> Chris, first of all thanks for your response.
>>>
>>> Il 27-Dec-24 18:37, Christopher Schultz ha scritto:
>>>>
>>>> Ivano,
>>>>
>>>> On 12/27/24 11:48 AM, Ivano Luberti wrote:
>>>> > Tomcat version is 9.0.96
>>>> >
>>>> > I have two questions:
>>>> >
>>>> > 2) The docs (https://tomcat.apache.org/tomcat-9.0-doc/servletapi/
>>>> javax/ servlet/ServletContextListener.html) state that
>>>> >
>>>> >> All servlets and filters have been destroyed before any
>>>> ServletContextListeners are notified of context destruction.
>>>> >>
>>>> > Now in my code I have a servlet class (MyServletClass) that
>>>> implements ServletContextListener and contextDestroyed
>>>> >
>>>> > and another not servlet class (say MyClass) that implements those
>>>> as well.
>>>>
>>>> You have a Servlet that implements ServletContextListener, and also
>>>> includes a contextDestroyed(ServletContextEvent) method? Okay.
>>>>
>>>> > Using breakpoints I see that MyClass.contextDestroyed called
>>>> BEFORE MyServletClass.contextDestroyed
>>>> >
>>>> > and for what I understand it should be the other way around.
>>>>
>>>> For what reason? If they are both implementing
>>>> ServletContextListener, they should both be called. But there is no
>>>> guarantee of the order in which they are called.
>>>>
>>>> The fact that one of them is a Servlet is not relevant.
>>>>
>>> The doc says:
>>>
>>> All servlets and filters have been destroyed before any
>>> ServletContextListeners are notified of context destruction.
>>
>> Correct. So your servlet's destroy() method should be called before
>> any ServletContextListener.contextDestroyed() method is called, and
>> for your Servlet/ServletContextListener, you should get one call
>> before the second, reliably.
>>
>> If you use a debugger (or just logging statements), you should be able
>> to confirm that.
>
> In other words the docs are saying that for each servlet destroy() is
> called before contextDestroyed). Right ?
/Every/ servlet should have .destroy() called before /any/ filter gets a
.contextDestroyed() call.
> Then I think it should be stated more precisely since it can be
> interpreted as all the servlets are destroyed before any
> contextDestroyed() method is called in any class.
I believe we are saying the same thing.
Please note that Apache Tomcat is not responsible for the language of
the Servlet Specification. If you believe there is confusing language in
the spec, please file a bug against the Jakarta EE project here:
https://github.com/jakartaee/servlet
>>>> From Tomcat's perspective, it's just a ServletContextListener like
>>>> any other. I would bet that you get two separate instances of that
>>>> class in memory, as well: one to serve as the Servlet and another to
>>>> serve as the ServletContextListener. Forcing them to be the same
>>>> object might be difficult to accomplish.
>>>
>>> I can't follow you: if I have a class like
>>>
>>> public class MyServlet extends HttpServlet implements
>>> ServletContextListener {
>>>
>>> there will be two objects in memory?
>>
>> Most likely, yes. Try this:
>>
>>
>> public class MyServlet extends HttpServlet implements
>> ServletContextListener {
>> public void init() {
>> getServletConfig().getServletContext().log(getClass().getName() + "
>> instance " + hashCode() + " init()");
>> }
>>
>> public void destroy() {
>> getServletConfig().getServletContext().log(getClass().getName() + "
>> instance " + hashCode() + " destroy()");
>> }
>>
>> public void contextInitialized(ServletContextEvent sce) {
>> sce.getServletContext().log(getClass().getName() + " instance
>> " + hashCode() + " contextInitialized()");
>> }
>>
>> public void contextDestroyedServletContextEvent sce) {
>> sce.getServletContext().log(getClass().getName() + " instance
>> " + hashCode() + " contextDestroyed()");
>> }
>> }
>>
>> You should end up with log messages that look like this:
>>
>> MyServlet instance 3876ace contextInitialized()
>> MyServlet instance ab65de init()
>> MyServlet instance ab65de destroyed()
>> MyServlet instance 3876ace contextDestroyed()
>>
>> If that's not the case, please post source for a web application that
>> reproduces the issue and we will look at it.
>>
> I can confirm you are right.
Good :D
-chris
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: (errata corige) contextDestoryed events order of calling
Posted by Ivano Luberti <lu...@archicoop.it.INVALID>.
Thanks Chris.
Il 02-Jan-25 19:34, Christopher Schultz ha scritto:
> Ivano,
>
> On 12/31/24 3:56 AM, Ivano Luberti wrote:
>> Chris
>>
>> Il 27-Dec-24 19:18, Christopher Schultz ha scritto:
>>> Ivano,
>>>
>>> On 12/27/24 12:48 PM, Ivano Luberti wrote:
>>>> Chris, first of all thanks for your response.
>>>>
>>>> Il 27-Dec-24 18:37, Christopher Schultz ha scritto:
>>>>>
>>>>> Ivano,
>>>>>
>>>>> On 12/27/24 11:48 AM, Ivano Luberti wrote:
>>>>> > Tomcat version is 9.0.96
>>>>> >
>>>>> > I have two questions:
>>>>> >
>>>>> > 2) The docs
>>>>> (https://tomcat.apache.org/tomcat-9.0-doc/servletapi/ javax/
>>>>> servlet/ServletContextListener.html) state that
>>>>> >
>>>>> >> All servlets and filters have been destroyed before any
>>>>> ServletContextListeners are notified of context destruction.
>>>>> >>
>>>>> > Now in my code I have a servlet class (MyServletClass) that
>>>>> implements ServletContextListener and contextDestroyed
>>>>> >
>>>>> > and another not servlet class (say MyClass) that implements
>>>>> those as well.
>>>>>
>>>>> You have a Servlet that implements ServletContextListener, and
>>>>> also includes a contextDestroyed(ServletContextEvent) method? Okay.
>>>>>
>>>>> > Using breakpoints I see that MyClass.contextDestroyed called
>>>>> BEFORE MyServletClass.contextDestroyed
>>>>> >
>>>>> > and for what I understand it should be the other way around.
>>>>>
>>>>> For what reason? If they are both implementing
>>>>> ServletContextListener, they should both be called. But there is
>>>>> no guarantee of the order in which they are called.
>>>>>
>>>>> The fact that one of them is a Servlet is not relevant.
>>>>>
>>>> The doc says:
>>>>
>>>> All servlets and filters have been destroyed before any
>>>> ServletContextListeners are notified of context destruction.
>>>
>>> Correct. So your servlet's destroy() method should be called before
>>> any ServletContextListener.contextDestroyed() method is called, and
>>> for your Servlet/ServletContextListener, you should get one call
>>> before the second, reliably.
>>>
>>> If you use a debugger (or just logging statements), you should be
>>> able to confirm that.
>>
>> In other words the docs are saying that for each servlet destroy() is
>> called before contextDestroyed). Right ?
>
> /Every/ servlet should have .destroy() called before /any/ filter gets
> a .contextDestroyed() call.
>
>> Then I think it should be stated more precisely since it can be
>> interpreted as all the servlets are destroyed before any
>> contextDestroyed() method is called in any class.
>
> I believe we are saying the same thing.
>
> Please note that Apache Tomcat is not responsible for the language of
> the Servlet Specification. If you believe there is confusing language
> in the spec, please file a bug against the Jakarta EE project here:
> https://github.com/jakartaee/servlet
>
>>>>> From Tomcat's perspective, it's just a ServletContextListener like
>>>>> any other. I would bet that you get two separate instances of that
>>>>> class in memory, as well: one to serve as the Servlet and another
>>>>> to serve as the ServletContextListener. Forcing them to be the
>>>>> same object might be difficult to accomplish.
>>>>
>>>> I can't follow you: if I have a class like
>>>>
>>>> public class MyServlet extends HttpServlet implements
>>>> ServletContextListener {
>>>>
>>>> there will be two objects in memory?
>>>
>>> Most likely, yes. Try this:
>>>
>>>
>>> public class MyServlet extends HttpServlet implements
>>> ServletContextListener {
>>> public void init() {
>>> getServletConfig().getServletContext().log(getClass().getName() + "
>>> instance " + hashCode() + " init()");
>>> }
>>>
>>> public void destroy() {
>>> getServletConfig().getServletContext().log(getClass().getName() + "
>>> instance " + hashCode() + " destroy()");
>>> }
>>>
>>> public void contextInitialized(ServletContextEvent sce) {
>>> sce.getServletContext().log(getClass().getName() + "
>>> instance " + hashCode() + " contextInitialized()");
>>> }
>>>
>>> public void contextDestroyedServletContextEvent sce) {
>>> sce.getServletContext().log(getClass().getName() + "
>>> instance " + hashCode() + " contextDestroyed()");
>>> }
>>> }
>>>
>>> You should end up with log messages that look like this:
>>>
>>> MyServlet instance 3876ace contextInitialized()
>>> MyServlet instance ab65de init()
>>> MyServlet instance ab65de destroyed()
>>> MyServlet instance 3876ace contextDestroyed()
>>>
>>> If that's not the case, please post source for a web application
>>> that reproduces the issue and we will look at it.
>>>
>> I can confirm you are right.
>
> Good :D
>
> -chris
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
--
Archimede Informatica tratta i dati personali in conformità a quanto
stabilito dal Regolamento UE n. 2016/679 (GDPR) e dal D. Lgs. 30 giugno
2003 n. 196
per come modificato dal D.Lgs. 10 agosto 2018 n. 101.
Informativa completa
<http://www.archicoop.it/fileadmin/pdf/InformativaTrattamentoDatiPersonali.pdf>
Il contenuto di questo messaggio e dei suoi eventuali allegati è
riservato. Nel caso in cui Lei non sia il destinatario, La preghiamo di
contattare telefonicamente o via e-mail il mittente ai recapiti sopra
indicati e di cancellare il messaggio e gli eventuali allegati dal Suo
sistema senza farne copia o diffonderli. Le opinioni espresse sono
quelle dell'autore e non rappresentano necessariamente quelle della Società.
This message and any attachment are confidential.If you are not the
intended recipient, please telephone or email the sender and delete this
message and any attachment from your system. If you are not the intended
recipient you must not copy this message or attachment or disclose the
contents to any other person. Any opinions presented are solely those of
the author and do not necessarily represent those of the Company.
dott. Ivano Mario Luberti
Archimede Informatica società cooperativa a r. l.
Via Gereschi 36, 56127 Pisa
tel.: +39 050/580959
web: www.archicoop.it
linkedin: www.linkedin.com/in/ivanoluberti
facebook: www.facebook.com/archimedeinformaticapisa/