2016-07-28 7 views
1

JAX-RS stellt die StreamingOutput-Schnittstelle zur Verfügung, die wir für das rohe Streaming unserer Antwortstellen implementieren können.StreamingOutput in jax-rs-Anwendungsfällen?

public interface StreamingOutput { 
    void write(OutputStream output) 
} 

Ich bin mir nicht sicher, warum sie über das Erstellen einer Schnittstelle gehen, um den Antwort-Ausgangsstrom verfügbar zu machen. Warum injizieren Sie nicht einfach einen OutputStream und wir können einfach darauf schreiben !!

Antwort

1

In dem Buch RESTful Java with JAX-RS 2.0 geschrieben von Bill Burk (einer der Autoren von RESTEasy) finden Sie eine gute Erklärung über StreamingOutput.

Die gleiche Frage, die Sie vom Autor gefragt wird, antwortet:

StreamingOutput ist eine einfache Callback-Schnittstelle, die Sie implementieren, wenn Sie rohe Streaming Antwort Körper [...]

Sie tun wollen replizieren Sie implementierte Instanzen dieser Schnittstelle und geben Sie sie von Ihren JAX-RS-Ressourcenmethoden zurück. Wenn die JAX-RS-Laufzeit zum Schreiben des Antworthauptteils der Nachricht bereit ist, wird die write()-Methode in der StreamingOutput-Instanz aufgerufen. [...]

Sie fragen sich vielleicht, "Warum nicht einfach eine OutputStream direkt injizieren? Warum muss ein Callback-Objekt eine Streaming-Ausgabe durchführen? " Das ist eine gute Frage! Der Grund für ein Callback-Objekt ist, dass es der JAX-RS-Implementierung die Freiheit gibt, die Ausgabe so zu handhaben, wie sie es möchte. Aus Leistungsgründen kann es manchmal von Vorteil sein, dass die JAX-RS-Implementierung einen anderen Thread als den aufrufenden Thread verwendet, um Antworten auszugeben. Noch wichtiger ist, dass viele JAX-RS-Implementierungen ein Interceptor-Modell haben, das Dinge wie automatische GZIP-Codierung oder Response-Caching abstrahiert. Das direkte Streaming kann diese architektonischen Konstrukte normalerweise umgehen. Schließlich hat die Servlet 3.0-Spezifikation die Idee der asynchronen Antworten eingeführt. Das Callback-Modell fügt sich sehr gut in die Idee des asynchronen HTTP innerhalb der Servlet 3.0-Spezifikation ein.

Und die StreamingOutputdocumentation besagt Folgendes:

Dies ist eine leichte Alternative zu einem MessageBodyWriter.