2016-08-08 8 views
0

Ich versuche, asynchrone Jersey RESTful Webap zu erstellen.Jersey asynchrone Multi-Thread-Antwort?

Der folgende Code wird zum Testen der Implementierung verwendet, funktioniert aber nicht.

@Path("/demox") 
public class RESTClient { 

    public static boolean ran = false; 

    @GET 
    @Path("/test") 
    @ManagedAsync 
    public void test(@Suspended final AsyncResponse asyncResponse) throws InterruptedException { 
     asyncResponse.setTimeout(10000, TimeUnit.MILLISECONDS); 
     asyncResponse.setTimeoutHandler(ar -> ar.resume(
       Response.status(Response.Status.SERVICE_UNAVAILABLE) 
         .entity("Operation timed out") 
         .build())); 
     if(!ran) { 
      while(true) { 
       ran = true; 
      } 
     } 
     asyncResponse.resume("REST IS OKAY! "); 
    } 
} 

Die Art, wie ich es teste, ich öffne die URL zweimal. Die zweite Registerkarte wartet jedoch immer auf die erste Zeitüberschreitung. Das funktioniert also offensichtlich nicht.

Servlet-Datei:

<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>services,org.codehaus.jackson.jaxrs</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

Antwort

0

Ich denke, es funktioniert. Entsprechend zu here:

Durch die AsyncResponse Parameter in einer Ressource Methode wir die Jersey Laufzeit sagen, dass das Verfahren soll aufgerufen werden, um die asynchrone Verarbeitung Modus, dh die Client-Verbindung nicht automatisch von der zugrunde liegenden geschlossen werden soll E/A-Container, wenn die Methode zurückkehrt. Stattdessen wird die injizierte AsyncResponse-Instanz (die die gesperrte Clientanforderungsverbindung darstellt) verwendet, um die Antwort mithilfe eines anderen Threads explizit an den Client zu senden. Mit anderen Worten, Jersey Runtime weiß, dass, wenn die asyncGet-Methode abgeschlossen ist, die Antwort auf den Client möglicherweise noch nicht bereit ist und die Verarbeitung angehalten werden muss und darauf wartet, dass sie mit einer Antwort wieder aufgenommen wird, sobald sie verfügbar ist.

+0

Ja. Aber wie erklären Sie die Wartezeit, die für das Laden des zweiten Browser-Tabs benötigt wird? Alle Tabs, die nach dem ersten Tab geöffnet werden, warten darauf, dass sie vollständig geladen werden. Anschließend werden sie sofort geladen. –

+0

erwähnten Link ist jetzt kaputt, es kann nachgeschlagen werden: https://jersey.github.io/documentation/latest/async.html – anand