2013-04-18 16 views
6

Mam nieskończoną liczbę InputStream z pewnymi danymi, które chcę zwrócić w odpowiedzi na żądanie HTTP GET. Chcę, aby mój klient web/API odczytywał z niego bez końca. Jak mogę to zrobić z JAX-RS? Próbuję tego:Jak przesyłać strumieniowo nieskończony strumień wejściowy za pomocą 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(); 
      } 
     } 
    }; 
} 

Ale treści nie pojawiają się dla klienta. Jeśli jednak dodaję OutputStream#close(), serwer dostarcza treść w tym momencie. Jak mogę sprawić, by był naprawdę możliwy do przesłania?

+0

znam go tylko dla plików skończonych, ale być może można spróbować produkcji MediaType.APPLICATION_OCTET_STREAM – Thomas

+0

starał, że żadnego efektu :( – yegor256

+0

Która Wdrożenie JAX-RS używasz? – bdkosher

Odpowiedz

0

Tylko dzikie przypuszczenie:

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

Jak wyjaśniono powyżej, 'InputStream' zostanie całkowicie wczytana do pamięci ** najpierw **, a ** następnie ** dostarczona do klienta. Nie tego szukam – yegor256

+0

Próba użycia odpowiedzi była dalekosiężna, myślałem, że spławi się w ten sposób. –

2

Tak, masz problemy spłukiwania, można postarać się o ServletResponse jako spec mówi:

@Context adnotacja może być używany do wskazania zależność od zasobu zdefiniowanego przez serwlet. Implementacja oparta na Servlet MUSI wspierać iniekcje następujących typów zdefiniowanych przez Servlet: ServletConfig, ServletContext, HttpServletRequest i HttpServletResponse.

Wstrzykiwana metoda HttpServletResponse umożliwia metodę zasobów do zatwierdzenia odpowiedzi HTTP HTTP przed zwróceniem. Implementacja MUSI sprawdzić stan zatwierdzenia i przetwarzać tylko wartość zwracaną, jeśli odpowiedź nie została jeszcze zatwierdzona.

Następnie spłukiwania wszystkiego można coś takiego:

@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 ""; 
} 
Powiązane problemy