2015-07-09 3 views
7

Ich arbeite an der Erstellung von API, die potenziell eine hohe Anzahl von Anforderungen pro Sekunde haben könnte, und einige der Anforderungen erfordern möglicherweise eine Menge Berechnung (komplexe Berichte). Ich wurde gebeten, einen kleinen Prototyp als Proof of Concept zusammenzustellen. Ich benutze Spring Boot mit Jersey als meine JAX-RS-Implementierung. In der Vergangenheit habe ich so etwas mit Spring MVC gemacht.Async-API mit Spring + Jersey

Ich versuchte dies mit Jersey und scheint zu arbeiten, oder zumindest hat es keinen Fehler geworfen.

@GET 
    public DeferredResult<String> getClients() { 
     DeferredResult<String> deferredResult = new DeferredResult<>(); 
     deferredResult.setResult("Nothing! But I'm Async!"); 
     return deferredResult; 
    } 

Alle Beispiele, die ich für asynchrone Verarbeitung von Operationen in Jersey gesehen habe, sehen jedoch so aus.

Meine Hauptfrage ist, was ist der Unterschied zwischen diesen drei Code-Schnipsel hinter den Kulissen, wenn es überhaupt welche gibt. Werden diese alle dasselbe erreichen?

Gibt es einen besseren Weg Async zu erreichen? Ich habe auch die Verwendung von Future in Java gesehen, aber nie benutzt.

UPDATE:

Ich habe den folgenden Code in meinem Jersey-Controller, der alle Arbeiten ist.

@GET 
    public String getClients() { 
     return "Nothing, I'm Sync!"; 
    } 

    @GET 
    @Path("/deferred") 
    public DeferredResult<String> getClientsAsync() { 
     DeferredResult<String> deferredResult = new DeferredResult<>(); 
     deferredResult.setResult("Nothing! But I'm Async!"); 
     return deferredResult; 
    } 

    @GET 
    @Path("/async") 
    public void getClientsJAXRSAsync(@Suspended AsyncResponse response) { 
     new Thread(() -> { 
      response.resume("I am Async too! But I am using @Suspended"); 
     }).start(); 
    } 

Das geht zurück auf meine Hauptfrage, was ist der Unterschied zwischen diesen? Mein Verständnis ist DeferredResult ist eine Spring-Sache so nicht sicher, ob es geeignet ist, mit Jersey zu verwenden, obwohl ich Jersey + Spring verwenden.

+0

Dies ist eine meiner geposteten Frage. Schau es dir an .. http://stackoverflow.com/questions/29563475/null-pointer-exception-in-restasy-asynchronous-request HINWEIS: Ich habe immer noch nicht getestet, ob die vorgeschlagene Antwort funktioniert .. –

Antwort

-3

Ihr Verständnis ist ganz richtig.Beide machen einen gleichen Job. Aber Implementierungen sind anders. DeferredResult ist eine Spring-Implementierung. Und in Ihrer Codebasis ist der größte Teil der JAX-RS-Implementierung. Ich bin mir nicht sicher, ob Sie vom ersten Dienst eine Antwort bekommen.

Aber meine Meinung ist, entweder verwenden Sie Federklassen oder JAX-RS. Aber nicht beides in derselben Methode.

+0

Die Die ersten zwei Methoden sind nicht asynchron, diese können auf der Clientseite asynchron sein (basierend auf dem Typ der Anforderungseinstellungen), aber sie sind im Backend vollständig synchron, bis die Methode ihre Ausführung beendet hat. Die dritte Methode, die vom OP gepostet wurde, ist ein Beispiel für eine asynchrone Real-Server-Verarbeitung. –

Verwandte Themen