2016-12-16 1 views
1

J'utilise RESTEasy 3.1.0.CR3 avec son servlet Tomcat 8.5 dans initialiseur, via des annotations (pas web.xml):RESTEasy l'application JAX-RS ne pas appeler @PreDestroy

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

J'ai un JAX-RS application que je dois savoir avant qu'il ne soit détruit/désinstallée du récipient, afin que je puisse libérer des ressources (arrêter un fil):

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

    … 

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

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

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

Mais ma méthode end() ne semble pas être appelé. Est-ce que je fais cela mal? Existe-t-il un meilleur moyen de détecter quand une application JAX-RS est supprimée?

+0

[Je pense que c'est un bug lié] (https://java.net/jira/browse/JERSEY-1982) Et désolé, je suis confondu avec un bean entity. Je ne sais pas si JAX-RS a la méthode PostDestroy – Gatusko

+0

Qu'est-ce qu'un bug Jersey a à faire avec RESTEasy? –

+0

Pouvez-vous créer un référentiel avec un exemple complet? Je ne vois rien de mal avec le code que vous avez donné jusqu'ici. – Adam

Répondre

0

Je ne suis pas sûr si cela est pris en charge. Pour @PreDestory, la règle applicable comme pour @PostConstruct:

Cette annotation DOIT être pris en charge sur toutes les classes qui prennent en charge l'injection de dépendance.

L'injection de dépendance dans une classe Application est-elle prise en charge? Une implémentation JAX-RS peut intégrer des Beans gérés, des EJB ou des CDI, mais cela est facultatif. JAX-RS fournit lui-même une injection de dépendance via @Context mais explicitement et non dans une classe Application (voir 9.2.1 de la spécification).

Donc, @PreDestory peut fonctionner dans certains environnements, mais il n'y a aucune garantie.

Dans votre environnement, je voudrais mettre en œuvre un ServletContextListener personnalisé et libérer des ressources dans #contextDestroyed. Votre Application classe doit être accessible via the ServletContext:

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

Vous pouvez aussi gérer tout dans une coutume ServletContextListener sans les références de classe d'applications et magasin comme ServletContext attributs.

+0

Et comment mon 'ServletContextListener' obtenir une référence à mon application JAX-RS? (Plusieurs instances de cette application s'exécutent sur le même serveur et chacune a des ressources à libérer lors de la fermeture.) –

+0

Oui, c'est correct. –

+0

Désolé, avez-vous répondu à ma question "Et comment mon ServletContextListener obtient-il une référence à mon application JAX-RS?" –