2016-07-28 54 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