2016-12-16 3 views
1

Ich verwende Resteasy 3.1.0.CR3 mit Servlet initializer in Tomcat 8.5, über Annotationen (keine web.xml):Resteasy JAX-RS-Anwendung nicht @PreDestroy Aufruf

<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> 

Ich habe einen JAX-RS Anwendung, die ich wissen müssen, bevor es aus dem Behälter zerstört/deinstalliert wird, so dass ich einige Ressourcen freigeben kann (Stop einen Thread):

@ApplicationPath("/") 
public class MyRESTApplication extends Application { 

    … 

    @Override 
    public Set<Class<?>> getClasses() { 
    … 
    } 

    @Override 
    public Set<Object> getSingletons() { 
    … 
    } 

    @PreDestroy 
    public void end() { 
    //TODO release resources 
    } 

Aber meine end() Methode scheint nicht aufgerufen werden. Mache ich das falsch? Gibt es einen besseren Weg, um zu erkennen, wann eine JAX-RS-Anwendung abgebaut wird?

+0

[Ich denke, das ist ein Fehler im Zusammenhang] (https://java.net/jira/browse/JERSEY-1982) Und tut mir leid, ich bin verwirrt mit einer Entity Bean. Ich weiß nicht, ob JAX-RS die Methode PostDestroy hat – Gatusko

+0

Was hat ein Jersey Bug mit RESTEasy zu tun? –

+0

Können Sie ein Repository mit einem vollständigen Beispiel erstellen? Ich kann nichts sehen, was mit dem Code, den Sie bisher angegeben haben, nicht stimmt. – Adam

Antwort

0

Ich bin mir nicht sicher, ob dies unterstützt wird. Für @PreDestory gilt die gleiche Regel wie für @PostConstruct:

Diese Anmerkung muss auf allen Klassen, die Dependency Injection unterstützen unterstützt werden.

Wird die Abhängigkeitseinspritzung in einer Application Klasse unterstützt? Eine JAX-RS-Implementierung kann Managed Beans, EJBs oder CDI integrieren, dies ist jedoch optional. JAX-RS selbst liefert die Abhängigkeitsinjektion über @Context, aber explizit nicht in einer Application Klasse (Kap. 9.2.1 der Spezifikation).

So kann @PreDestory in einigen Umgebungen funktionieren, aber es gibt keine Garantie. In Ihrer Umgebung würde ich eine benutzerdefinierte ServletContextListener implementieren und Ressourcen in #contextDestroyed freigeben. Ihre Application Klasse sollte zugänglich via the ServletContext sein:

Map<String, ResteasyDeployment> deployments = (Map<String, ResteasyDeployment>) 
    request.getServletContext().getAttribute("resteasy.deployments"); 
ResteasyDeployment deployment = deployments.get("/application/path"); 
Application application = deployment.getApplication(); 

Sie auch alles in einem benutzerdefinierten ServletContextListener ohne die Anwendungsklasse und speichern Referenzen umgehen konnte als ServletContext Attribute.

+0

Und wie würde mein 'ServletContextListener' einen Verweis auf meine JAX-RS-Anwendung bekommen? (Es gibt mehrere Instanzen dieser Anwendung, die auf demselben Server ausgeführt werden, und jeder verfügt über Ressourcen, die er beim Herunterfahren freigeben muss.) –

+0

Ja, das ist richtig. –

+0

Entschuldigung, haben Sie meine Frage beantwortet? Und wie würde mein ServletContextListener einen Verweis auf meine JAX-RS-Anwendung erhalten?" –