我正在使用Resteasy 3.1.0.cr3,其Servlet Initializer在Tomcat 8.5中使用(无web.xml
):
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.1.0.CR3</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>3.1.0.CR3</version>
</dependency>
我有一个我需要知道的JAX-RS应用程序,然后将其从容器中销毁/卸载,以便我可以释放一些资源(停止线程):
@ApplicationPath("/")
public class MyRESTApplication extends Application {
…
@Override
public Set<Class<?>> getClasses() {
…
}
@Override
public Set<Object> getSingletons() {
…
}
@PreDestroy
public void end() {
//TODO release resources
}
但我的end()
方法似乎没有被调用。我做错了吗?是否有更好的方法可以检测何时取下JAX-RS应用程序?
这似乎是JAX-RS规范中的一个很大的监督。请参阅以下讨论:
[JAX-RS-SPEC用户] FWD:应用程序子类中的生命周期管理
一些合理的解决方法将不胜感激。
我不确定是否支持。对于@PreDestory
,相同的规则适用于@PostConstruct
:
必须在支持依赖注入的所有类中支持此注释。
支持Application
类中的依赖性注入?JAX-RS实现可能会集成托管的豆类,EJB或CDI,但这是可选的。JAX-RS本身通过@Context
提供依赖性注入,但在Application
类中明确不是(规范的9.2.1)。
所以@PreDestory
可能在某些环境中工作,但不能保证。
在您的环境中,我将在#contextDestroyed
中实现自定义ServletContextListener
并发布资源。您的Application
类应通过ServletContext访问:
Map<String, ResteasyDeployment> deployments = (Map<String, ResteasyDeployment>)
request.getServletContext().getAttribute("resteasy.deployments");
ResteasyDeployment deployment = deployments.get("/application/path");
Application application = deployment.getApplication();
您还可以在不使用应用程序类的情况下处理自定义ServletContextListener
中的所有内容,并将引用存储为ServletContext属性。