2013-04-14 117 views
11

我有這項任務,我正在從事設備中讀取數據並通過Web服務使其可用。數據每秒讀取4次。我希望Web客戶端擁有開放的HTTP連接,並且只要客戶端保持連接處於打開狀態,就可以使用chunked transfer以流的形式獲取設備讀數。Restlet流式傳輸數據

作爲一個概念證明,我想從一個不斷生成隨機數的服務開始,每秒4次,將其包裝在json中並將其傳遞給客戶端。我試圖基於twitter streaming api.

鬆散地建模我正在使用restlet 2.1.2創建該webservice,但我不確定應使用哪種表示形式來實現此目的。我試圖尋找這個,但沒有發現任何有用的東西。有人能指出我正確的方向,我應該使用什麼,也許有些例子。

感謝

+0

你的意思是你應該使用什麼子類型的表示形式? JsonRepresentation應該是一個: http://restlet.org/learn/javadocs/snapshot/jse/ext/org/restlet/ext/json/JsonRepresentation.html 它的一個構造函數很方便:JsonRepresentation(Map map) –

+0

你是否被Restlet綁定?我不認爲它支持你需要開箱即用,沒有[黑客攻擊](http://rfc2616.wordpress.com/2010/11/16/streaming-output-from-a-restlet-resource/)。有一個Web服務庫處理異步/蒸汽 - [Atmosphere](https://github.com/Atmosphere/atmosphere)。 – pfyod

+0

@DiegoAlcántaraJsonRepresentation不能用於傳輸動態內容,我不這麼認爲。 –

回答

3

要達到什麼樣的你正在嘗試做的,我會用WriterRepresentation(但看到我answer to your other question),但我我相當確信你的方向是錯誤的。

事實上從文檔下面的圖片你鏈接

enter image description here

顯示Twitter的流API並不打算怎麼連被用戶連接,而是通過在被訪問的商店下載郵件後臺進程HTTP。用戶只輪詢HTTP服務器,該服務器從商店讀取消息並將其發送回客戶端。

作爲斷開連接的協議,HTTP支持不可能的大規模可擴展性。如果每個客戶端建立一個持續TCP連接,該連接由專用服務器線程支持,您將快速獲取服務器資源!此外,用戶代理與服務器之間的任何HTTP代理都可能導致意外行爲。

因此,如果你被綁定到HTTP協議,用戶代理應輪詢。您可以使用標頭Last-Modified/If-Modified-SinceEtag/If-None-Match來減少網絡負載。

但是,如果您可以採用不同的協議,我強烈建議您通過連接的TCP協議嘗試服務總線。

+0

我有一個非常獨特的要求,因此我走了這條路。 Web服務將只有每個連接1到2個客戶端,並且大多數情況下只有一個客戶端,所以可擴展性不是問題。 –

+0

儘管如此,HTTP代理可能會成爲一個問題。順便說一句,你正面臨的問題是什麼?特別是,爲什麼投票不是一種選擇? –

+0

這就像我試圖圍繞已經存在的客戶端創建服務器。曾經存在的服務器是使用不同的技術編寫的,我沒有源代碼來查看它是如何實現的。輪詢沒有使用,因爲連接建立和關閉被認爲是一個開銷,但現在這個while循環沒有被證明是更好的,但它是什麼,我試圖看看我是否可以使restlet服務工作。 –