2013-04-18 6 views
6

Possiedo un numero infinito di InputStream con alcuni dati, che desidero restituire in risposta a una richiesta HTTP GET. Voglio che il mio client web/API legga da esso all'infinito. Come posso farlo con JAX-RS? Sto provando questo:Come eseguire lo streaming di un InputStream infinito con 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(); 
      } 
     } 
    }; 
} 

Ma il contenuto non viene visualizzato per il client. Tuttavia, se aggiungo OutputStream#close(), il server consegna il contenuto in quel preciso momento. Come posso renderlo veramente scorrevole?

+0

ho usato solo per i file finiti, ma forse si potrebbe provare a produrre MediaType.APPLICATION_OCTET_STREAM – Thomas

+0

provato che, nessun effetto :( – yegor256

+0

Quale L'implementazione JAX-RS stai usando? – bdkosher

risposta

0

Solo una supposizione selvaggia:

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

Come spiegato sopra, 'InputStream' verrà letto interamente nella memoria ** prima ** e ** poi ** consegnato al client. Questo non è quello che sto cercando – yegor256

+0

Cercando di usare la risposta è stata una supposizione molto lontana, pensavo che sarebbe venuta fuori in questo modo. –

2

Quindi, si hanno problemi a livello, si potrebbe cercare di ottenere il ServletResponse come le specifiche dice:

L'annotazione @Context può essere usato per indicare una dipendenza da una risorsa definita da servlet. Un'implementazione basata su servlet DEVE supportare l'iniezione dei seguenti tipi definiti da Servlet: ServletConfig, ServletContext, HttpServletRequest e HttpServletResponse.

Un HttpServletResponse iniettato consente a un metodo di risorsa di impegnare la risposta HTTP prima di restituire. Un'implementazione DEVE controllare lo stato di commit e elaborare il valore di ritorno solo se la risposta è non ancora impegnata.

Poi vampate di calore tutto il possibile, in questo modo:

@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 ""; 
} 
Problemi correlati