在jax-rs用例中使用StreamingOutput?

时间:2016-07-28 09:52:13

标签: jax-rs

JAX-RS提供了StreamingOutput接口,我们可以实现这个接口来做我们的响应主体的原始流。

public interface StreamingOutput {
    void write(OutputStream output)
}

我不确定他们为什么要构建一个接口来公开响应输出流。为什么不直接注入一个OutputStream,我们可以简单地写一下!!

1 个答案:

答案 0 :(得分:2)

在Bill Burk(RESTEasy的一位作者)撰写的书RESTful Java with JAX-RS 2.0中,您会找到关于StreamingOutput的一个很好的解释。

作者回答了您提出的同样问题:

  

StreamingOutput是一个简单的回调接口,当您想要对响应主体进行原始流式传输时实现[...]

     

您分配此接口的已实现实例,并从JAX-RS资源方法返回它们。当JAX-RS运行时准备好编写消息的响应主体时,将在write()实例上调用StreamingOutput方法。 [...]

     

您可能会问自己,“为什么不直接注入OutputStream?为什么有一个回调对象来做流输出?“这是一个很好的问题!拥有回调对象的原因在于它为JAX-RS实现提供了自由处理它想要的输出。出于性能原因,JAX-RS实现有时可能有利于使用调用线程以外的其他线程来输出响应。更重要的是,许多JAX-RS实现都有一个拦截器模型,可以像自动GZIP编码或响应缓存一样抽象出来。直接流式传输通常可以绕过这些架构结构。最后,Servlet 3.0规范引入了异步响应的思想。回调模型非常适合Servlet 3.0规范中异步HTTP的思想。

StreamingOutput documentation声明如下:

  

这是MessageBodyWriter的轻量级替代品。