You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by David kerber <dc...@verizon.net> on 2015/12/11 14:30:42 UTC

Context destroy sequence of events

Running TC 8.0.22 with JRE 1.8.0.60 on Windows 2008 R2, as a windows 
service.

Can someone point me to a reference that will tell me exactly what the 
sequence of events is when a servlet that is running as a windows 
service, is shut down?

My situation is that my application receives data in a continuous stream 
and caches them for a period of time.  Then based on a couple of 
different triggers, it will write them to disk.

What I need is a way to allow the windows service to be stopped in such 
a way that the servlet will not accept any more data while I flush my 
caches to disk.  This ensures that I don't lose any data during the 
shutdown (the remote clients that are sending the data will not move on 
to the next piece of data until they get the correct response from the 
server for the previous one).

If I can ensure that (for example) the servlet will not accept any more 
connections when contextDestroyed event is triggered, but I will still 
be able to call my cache flushing routines, I think that would do what I 
need.

Or if I can use the contextDestroyed event to set a flag in my 
servlet.doPost method to tell it to stop processing, that would work 
too.  Then I can call my cache flushing after that.

Suggestions?

Dave

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Context destroy sequence of events

Posted by David kerber <dc...@verizon.net>.
On 12/11/2015 4:36 PM, Mark Thomas wrote:
> On 11/12/2015 16:41, David kerber wrote:
>> On 12/11/2015 8:30 AM, David kerber wrote:
>>> Running TC 8.0.22 with JRE 1.8.0.60 on Windows 2008 R2, as a windows
>>> service.
>>>
>>> Can someone point me to a reference that will tell me exactly what the
>>> sequence of events is when a servlet that is running as a windows
>>> service, is shut down?
>>>
>>> My situation is that my application receives data in a continuous stream
>>> and caches them for a period of time.  Then based on a couple of
>>> different triggers, it will write them to disk.
>>>
>>> What I need is a way to allow the windows service to be stopped in such
>>> a way that the servlet will not accept any more data while I flush my
>>> caches to disk.  This ensures that I don't lose any data during the
>>> shutdown (the remote clients that are sending the data will not move on
>>> to the next piece of data until they get the correct response from the
>>> server for the previous one).
>>>
>>> If I can ensure that (for example) the servlet will not accept any more
>>> connections when contextDestroyed event is triggered, but I will still
>>> be able to call my cache flushing routines, I think that would do what I
>>> need.
>>>
>>> Or if I can use the contextDestroyed event to set a flag in my
>>> servlet.doPost method to tell it to stop processing, that would work
>>> too.  Then I can call my cache flushing after that.
>>>
>>> Suggestions?
>>
>> Is Servlet.destroy() the place for this kind of cleanup?
>
> Definitely not. In theory, a Servlet container can take any Servlet out
> of service any time it likes (as long as it is not is use) e.g. to
> reduce memory pressure.
>
> In a standard container stop the following happens (in this order, not
> exhaustive)
> - The connectors are paused so no new requests are processed
> - Existing requests continue to process
> - The Engine, Host and Contexts are stopped
> - The Contexts wait a configurable period of time for any running
> requests to finish (10s from memory although that might have changed)
> - contextDestroyed() is called
>
> So, the short version is call your flushing code from contextDestroyed()
> and you should be fine as long as you requests have finished. If they
> haven't, increase the wait time.

Thanks, Mark.  My requests only take a fraction of a second to process, 
so I should be good with the default wait time.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Context destroy sequence of events

Posted by Mark Thomas <ma...@apache.org>.
On 11/12/2015 16:41, David kerber wrote:
> On 12/11/2015 8:30 AM, David kerber wrote:
>> Running TC 8.0.22 with JRE 1.8.0.60 on Windows 2008 R2, as a windows
>> service.
>>
>> Can someone point me to a reference that will tell me exactly what the
>> sequence of events is when a servlet that is running as a windows
>> service, is shut down?
>>
>> My situation is that my application receives data in a continuous stream
>> and caches them for a period of time.  Then based on a couple of
>> different triggers, it will write them to disk.
>>
>> What I need is a way to allow the windows service to be stopped in such
>> a way that the servlet will not accept any more data while I flush my
>> caches to disk.  This ensures that I don't lose any data during the
>> shutdown (the remote clients that are sending the data will not move on
>> to the next piece of data until they get the correct response from the
>> server for the previous one).
>>
>> If I can ensure that (for example) the servlet will not accept any more
>> connections when contextDestroyed event is triggered, but I will still
>> be able to call my cache flushing routines, I think that would do what I
>> need.
>>
>> Or if I can use the contextDestroyed event to set a flag in my
>> servlet.doPost method to tell it to stop processing, that would work
>> too.  Then I can call my cache flushing after that.
>>
>> Suggestions?
> 
> Is Servlet.destroy() the place for this kind of cleanup?

Definitely not. In theory, a Servlet container can take any Servlet out
of service any time it likes (as long as it is not is use) e.g. to
reduce memory pressure.

In a standard container stop the following happens (in this order, not
exhaustive)
- The connectors are paused so no new requests are processed
- Existing requests continue to process
- The Engine, Host and Contexts are stopped
- The Contexts wait a configurable period of time for any running
requests to finish (10s from memory although that might have changed)
- contextDestroyed() is called

So, the short version is call your flushing code from contextDestroyed()
and you should be fine as long as you requests have finished. If they
haven't, increase the wait time.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Context destroy sequence of events

Posted by David kerber <dc...@verizon.net>.
On 12/11/2015 8:30 AM, David kerber wrote:
> Running TC 8.0.22 with JRE 1.8.0.60 on Windows 2008 R2, as a windows
> service.
>
> Can someone point me to a reference that will tell me exactly what the
> sequence of events is when a servlet that is running as a windows
> service, is shut down?
>
> My situation is that my application receives data in a continuous stream
> and caches them for a period of time.  Then based on a couple of
> different triggers, it will write them to disk.
>
> What I need is a way to allow the windows service to be stopped in such
> a way that the servlet will not accept any more data while I flush my
> caches to disk.  This ensures that I don't lose any data during the
> shutdown (the remote clients that are sending the data will not move on
> to the next piece of data until they get the correct response from the
> server for the previous one).
>
> If I can ensure that (for example) the servlet will not accept any more
> connections when contextDestroyed event is triggered, but I will still
> be able to call my cache flushing routines, I think that would do what I
> need.
>
> Or if I can use the contextDestroyed event to set a flag in my
> servlet.doPost method to tell it to stop processing, that would work
> too.  Then I can call my cache flushing after that.
>
> Suggestions?

Is Servlet.destroy() the place for this kind of cleanup?


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org