Resteasy JAX-RS应用程序未拨打@Predestroy



我正在使用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属性。

最新更新