users@jax-rs-spec.java.net

[jax-rs-spec users] Re: Lifecycle management in Application subclasses

From: Santiago Pericas-Geertsen <Santiago.PericasGeertsen_at_oracle.com>
Date: Fri, 14 Dec 2012 09:22:38 -0500

On Dec 13, 2012, at 12:40 PM, James Shaw <js102_at_zepler.net> wrote:

> On 13 December 2012 15:52, Marek Potociar <marek.potociar_at_oracle.com> wrote:
>>
>> On Dec 6, 2012, at 12:29 PM, James Shaw <js102_at_zepler.net> wrote:
>>
>>> I hope this is the correct place to raise this.
>>>
>>> I was looking for an Application method I could override that would be
>>> executed when the servlet container shuts down (I have some
>>> ExecutorServices that need to be stopped)
>>>
>>> I couldn't find such a method, so I've worked around the problem by
>>> implementing my own ServletContextListener and exposing the
>>> ExecutorServices through a static accessor. Something like this:
>>>
>>> @ApplicationPath("/") public class MyApplication extends Application {
>>> public MyApplication() {
>>> LifecycleListener.getExecutorService();
>>> ...
>>> }
>>> }
>>>
>>> @WebListener public class LifecycleListener implements
>>> ServletContextListener { ... }
>>>
>>> Has adding an Application.shutdown() hook to JAX-RS been discussed
>>> before? Is there another way I ought to be doing this?
>>
>> It hasn't been discussed IIRC. I wonder why you consider your solution a workaround? Why should JAX-RS specification define another callback for Servlet container, if there is one already defined in the Servlet API?
>>
> I didn't like the fact that I had to share state between the servlet
> context listener and the JAX-RS application using a static variable.

 What about storing it in the ServletContext using setAttribute(String, Object)? In contextDestroyed(source) you should be able to access it using source.getServletContext().getAttribute(String).

-- Santiago