2013-10-30 32 views
3

我正在运行JAX-RS应用程序,该应用程序在应用程序关闭后需要进行一些清理。我为此安装了一个关闭钩子,它工作正常。但是,在单元测试中,关闭挂钩(当然)并未触发,因为JVM在两次调用之间没有关闭。我想解决这个问题,只能使用关闭挂钩作为最后的手段。我想,如果我只从servlet容器中取消部署应用程序而没有明确触发关闭,则会发生同样的情况。另外,我想我可能在应用程序容器继续运行并且我的关闭挂钩仍然被注册的情况下创建了内存泄漏?如何监听JAX-RS取消部署

问题:是否有可能侦听负责我的JAX-RS应用程序的服务器/ servlet被销毁?我正在考虑像Servlet#destroy这样的方法。

我在寻找类似的东西:new ResourceConfig().register(new MyShutDownListener())或者我可以在ShutDownBinder做什么?有任何想法吗?

+0

ServletContextListener.contextDestroyed()方法对你的情况不好吗? –

+0

我开始使用由“GrizzlyHttpServerFactory”嵌入的应用程序(https://jersey.java.net/apidocs/latest/jersey/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpServerFactory.html)。我没有找到办法让自己陷入困境。 –

回答

3

那么,我找到了org.glassfish.jersey.server.spi.ContainerLifecycleListener接口。看起来好像这个界面在v2.3中进入了Jersey,而我的内建使用了v2.1。我现在升级泽西并愉快地使用它。 (但这是一个泽西岛接口,它在JAX-RS中没有兄弟姐妹。)

如果这个答案的未来读者不可以选择,我发现了另一个使用GrizzlyWebContainerFactory的解决方案,它允许我使用定义我自己的servlet来启动应用程序。不过,这种解决方案更加冗长。

+0

使用这个接口终于帮助我解决了[这里]描述的问题(http://jersey.576304.n2.nabble.com/What-is-the-proper-way-of-cleaning-up-asynchronous-requests- before-servlet-redeploy-Jersey-Tomcat-td7583818.html)在应用程序关闭期间及时取消打开的AsyncResponse,然后再无法与其进行交互。所有其他可能性(如'@ PreDestroy','ServletContextListener'或'@Observes @Destroyed(ApplicationScoped.class)')不起作用。 –