2014-09-04 2 views
1

J'essaie d'utiliser l'API JAX-RS Client pour demander une ressource via HTTP GET, en utilisant le code suivant: (J'ai utilisé jersey-client v2.12 et aussi resteasy-client v3 .0.8.Final pour tester l'implémentation)Demande asynchrone de l'API client JAX-RS

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.InvocationCallback; 

public class StackOverflowExample { 
    public static void main(String[] args) { 
    Client client = ClientBuilder.newClient(); 
    client.target("http://example.com/").request().async().get(new InvocationCallback<String>() { 
     @Override 
     public void completed(String s) { 
     System.out.println("Async got: " + s); 
     } 

     @Override 
     public void failed(Throwable throwable) { 
     System.out.println("Async failure..."); 
     } 
    }); 
    } 
} 

Comme je m'y attendais, la chaîne est imprimée presque immédiatement. Mais le processus continue de tourner environ une minute, bien qu'il n'y ait aucun code à exécuter.

La spécification JAX-RS dit simplement que nous devrions utiliser le InvocationCallback et rien d'autre qui compte pour mon problème. Mais même si j'utilise un Future le même effet se produit. J'ai aussi testé, si cela a quelque chose à voir avec un timeout, ce qui était très improbable et erroné. Le débogueur montre qu'il y a des threads en cours d'exécution, à savoir DestroyJavaVM et jersey-client-async-executor-0 ou pool-1-thread-1 dans le cas de resteasy.

Avez-vous une idée de ce qui ne va pas ici?

Répondre

1

Il est toujours utile de consulter le JavaDoc. Concernant mon problème it says:

Les clients sont des objets lourds qui gèrent l'infrastructure de communication côté client. L'initialisation ainsi que la mise au rebut d'une instance Client peut être une opération plutôt coûteuse. Il est donc conseillé de ne construire qu'un petit nombre d'instances Client dans l'application. Les instances clientes doivent être correctement fermées avant d'être éliminées afin d'éviter les fuites de ressources.

Si je ferme correctement le client, tout fonctionne comme prévu.

public class StackOverflowExample { 
    public static void main(String[] args) { 
    Client client = ClientBuilder.newClient(); 
    // request here 
    client.close(); 
    } 
}