2013-07-12 2 views
0

Я пытаюсь реализовать на стороне сервера События сервера в Play Framework 1.2.5Play Framework SSE Закрытие Chunked Ответ

Как я могу знать, если клиент называется 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) проверяется время с момента последнего 'получения'. Если он больше некоторого порога, мы можем считать, что SSE-канал закрыт.

Существует также этот класс play.libs.F.EventStream, который может быть полезен в пределах Producer.

Плюс, Producer может не быть правильного имени здесь, так как это скорее очередь диспетчеризации ...