2013-07-12 43 views
0

我試圖實現播放框架1.2.5播放框架SSE關閉分塊響應

我怎麼能知道叫EventSource.close()客戶端(或關閉了瀏覽器窗口服務器端事件服務器,例如)?這是服務器代碼的簡化一塊我使用:

public class SSE extends Controller { 

    public static void updater() { 
    response.contentType = "text/event-stream"; 
    response.encoding = "UTF-8"; 
    response.status = 200; 
    response.chunked = true; 

    while (true) { 
     Promise<String> promise = Producer.getNextMessage(); 
     String msg = await(promise); 
     response.writeChunk("data: " + msg + "\n\n"); 
    } 
    } 
} 

Producer應處理排隊,Promise對象,併產生輸出,但我要知道什麼時候該停止(盡顯其隊列)。如果輸出流被關閉,我會期待response.writeChunk()拋出一些異常,但是沒有任何異常。

有一個類似的例子,不與SSE處理,但只有大塊相反,在http://www.playframework.com/documentation/1.2.5/asynchronous#HTTPresponsestreaming

回答

0

由於play.mvc.Controller並不讓我知道,如果輸出流的執行過程中關閉,我通過解決問題Producer本身:

  1. Producer.getNextMessage()中,當前時間被記住。
  2. Producer.putMessage(String)中,檢查自上次'get'以來的時間。如果它大於某個閾值,我們可以認爲SSE頻道已經關閉。

還有這個類別play.libs.F.EventStream它可以在Producer內有用。

另外,Producer可能不是這裏的正確名稱,因爲它更像是一個調度隊列...