2013-05-10 57 views
0

我正在寫HTTP Web服務,可能需要相當長的時間來產生結果。我使用嵌入式Jetty 8.1.5和JAX-RS(Apache CXF)如何控制碼頭中的塊?

我決定採用某種控制協議:當新請求到達時,我在一個單獨的線程中啓動一個長時間運行的作業,並定期寫入具有當前狀態(「CONTROL_MESSAGE:42%完成」)的HttpOutputStream行

問題是Jetty在此使用塊編碼,所以我的狀態消息被緩衝並且無用,因爲它們都可以緩存在單個塊中,沒有一個客戶的進展。

我不能使用Content-Length屬性,因爲我不知道最終結果長度。由於Jetty使用內部緩衝區,HttpOutputStream.flush()不起作用。

正如我所看到的,我需要一種方式來告訴碼頭「請完成當前塊並沖洗它」,但不知道如何。

回答

1

其實我不確定你的問題是塊。如果我找到了你的答案,你正在寫進度到結果終於去的同一個流?

只需調用響應中的flushBuffers,就可以使用或不使用chunking。

然而,它取決於你的連接和你的瀏覽器,如果這使它進入客戶端。 透明代理可能會聚合內容並且不會刷新,直到響應完成或其自己的緩衝區已滿。瀏覽器可能不會處理任何內容,直到響應完成或緩衝區已滿。

在使用這種技術的彗星的一些實現中,必須在推送消息之後發送512個白色空間。

你最好使用類似於服務器發送的事件,websocket或長輪詢的方式向客戶端發送進度.....更好 - 只需使用cometd.org,它將爲客戶端選擇最佳傳輸可用。

+0

的確,問題實際上是Apache CXF在我們使用的版本中存在一個錯誤,它只是忽略了flush()調用。 – relgames 2013-05-18 16:29:25

1

您應該能夠通過向響應添加Connection:close標頭來禁用持久連接本身來關閉分塊,這是或提前知道Content-Length。或者我想你也可以使用HTTP/1.0。我將用jetty文檔打開一個錯誤,以便更好地記錄這些錯誤。

+0

它不起作用,消息仍然被緩衝。 – relgames 2013-05-11 13:16:45

+0

請參閱下面的回覆。你的問題不是組塊。 – gregw 2013-05-17 00:15:25