2013-04-18 9 views
6

Ich habe eine endlose InputStream mit einigen Daten, die ich als Antwort auf eine GET HTTP-Anfrage zurückgeben möchte. Ich möchte, dass mein Web/API-Client endlos daraus liest. Wie kann ich es mit JAX-RS machen? Ich versuche das:So streamen Sie einen endlosen InputStream mit JAX-RS

@GET 
@Path("/stream") 
@Produces(MediaType.TEXT_PLAIN) 
public StreamingOutput stream() { 
    final InputStream input = // get it 
    return new StreamingOutput() { 
     @Override 
     public void write(OutputStream out) throws IOException { 
      while (true) { 
       out.write(input.read()); 
       out.flush(); 
      } 
     } 
    }; 
} 

Aber Inhalt erscheint nicht für den Client. Wenn ich jedoch OutputStream#close() hinzufüge, liefert der Server den Inhalt genau in diesem Moment. Wie kann ich es wirklich streamable machen?

+0

ich es nur für endliche Dateien verwendet haben, aber vielleicht könnten Sie – Thomas

+0

versuchen produzieren MediaType.APPLICATION_OCTET_STREAM versucht, dass keine Wirkung :( – yegor256

+0

Welche JAX-RS-Implementierung verwenden Sie? – bdkosher

Antwort

0

Nur eine wilde Vermutung:

@GET 
@Path("/stream") 
@Produces(MediaType.TEXT_PLAIN) 
public Response stream() { 
    final InputStream input = getit(); 
    return Response.ok(input, MediaType.TEXT_PLAIN_TYPE).build();   
} 
+1

Wie oben erklärt, 'InputStream' wird vollständig in den Speicher gelesen ** zuerst ** und ** dann ** an den Client geliefert Dies ist nicht das, wonach ich suche – yegor256

+0

Der Versuch, Response zu verwenden, war eine weit verbreitete Vermutung. Ich dachte, es würde auf diese Weise fluten. –

2

So haben Sie flush Probleme, Sie könnten versuchen, die ServletResponse zu erhalten, wie die Spezifikation sagt:

Die @Context Anmerkung verwendet werden kann, um anzuzeigen, eine Abhängigkeit von einer Servlet-definierten Ressource . Eine Servlet-basierte Implementierung MUSS Injektion der folgenden Servlet-definierten Typen unterstützen: ServletConfig, ServletContext, HttpServletRequest und HttpServletResponse.

Eine injizierte HttpServletResponse ermöglicht einer Ressourcenmethode, die HTTP-Antwort vor der Rückgabe zu committen. Eine Implementierung MUSS den festgeschriebenen Status überprüfen und den Rückgabewert nur verarbeiten, wenn die Antwort noch nicht festgeschrieben ist.

Dann ist alles Spülen Sie können, wie folgt aus:

@Context 
private HttpServletResponse context; 

@GET 
@Path("/stream") 
@Produces(MediaType.TEXT_PLAIN) 
public String stream() { 
    final InputStream input = // get it 
    ServletOutputStream out = context.getOutputStream(); 
      while (true) { 
       out.write(input.read()); 
       out.flush(); 
       context.flushBuffer(); 
      } 
    return ""; 
} 
Verwandte Themen