Play Framework SSE关闭分块响应

时间:2013-07-12 13:12:02

标签: java playframework server-sent-events

我正在尝试在 Play Framework 1.2.5中实现服务器端事件服务器

如何知道客户端是否调用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

处理块。

1 个答案:

答案 0 :(得分:0)

由于play.mvc.Controller不让我知道输出流是否在执行期间关闭,我通过Producer本身解决了问题:

  1. Producer.getNextMessage()中,记住当前时间。
  2. Producer.putMessage(String)中,检查自上次“获取”以来的时间。如果它大于某个阈值,我们可以认为SSE通道已关闭。
  3. 此课程play.libs.F.EventStream也可以在Producer内使用。

    另外,Producer可能不是正确的名称,因为它更像是一个调度队列......