如何使用JAX-RS流式传输无限的InputStream

时间:2013-04-18 19:57:49

标签: java jersey jax-rs

我有一些带有一些数据的无尽InputStream,我想在响应GET HTTP请求时返回这些数据。我希望我的web / API客户端能够无休止地阅读它。如何使用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();
            }
        }
    };
}

但客户端不会显示内容。但是,如果我添加OutputStream#close(),服务器会在当时发送内容。我怎样才能让它真正流畅?

3 个答案:

答案 0 :(得分:2)

所以,你有冲洗问题,你可以尝试获得规范所说的ServletResponse:

  

@Context注释可用于指示对a的依赖   Servlet定义的资源。基于Servlet的实现必须支持   注入以下Servlet定义的类型:ServletConfig,   ServletContext,HttpServletRequest和HttpServletResponse。

     

注入的HttpServletResponse允许资源方法提交   返回前的HTTP响应。一个实现必须检查   已提交状态,仅在响应时处理返回值   尚未承诺。

然后冲洗你能做的一切,就像这样:

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

答案 1 :(得分:0)

只是猜测:

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

答案 2 :(得分:0)

只需使用JAX-RS的StreamingOutput

@Path(“ / numbers”) 公共类NumbersResource {

@GET
public Response streamExample(){
    StreamingOutput stream = new StreamingOutput() {
        @Override
        public void write(OutputStream out) throws IOException, WebApplicationException {
            Writer writer = new BufferedWriter(new OutputStreamWriter(out));
            for (int i = 0; i < 10000000 ; i++){
                writer.write(i + " ");
            }
            writer.flush();
        }
    };
    return Response.ok(stream).build();
}

}