2016-07-28 75 views
1

JAX-RS提供StreamingOutput接口,我们可以实现原始流式传输响应主体。jax-rs用例中的StreamingOutput?

public interface StreamingOutput { 
    void write(OutputStream output) 
} 

我不确定他们为什么要构建一个接口来公开响应outputstream。为什么不直接注入OutputStream,我们可以直接写入!

回答

1

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

你问同样的问题由作者回答说:

StreamingOutput是当你想要做响应主体的原始数据流,你实现一个简单的回调接口[...]

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

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

而且StreamingOutputdocumentation规定如下:

这是一个轻量级替代一个MessageBodyWriter

相关问题