1

我正在尝试在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(),但没有任何异常。

在http://www.playframework.com/documentation/1.2.5/asynchronous#HTTPresponsestreaming有一个类似的示例不处理 SSE,而只处理块

4

1 回答 1

0

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

  1. Producer.getNextMessage()中,记住当前时间。
  2. Producer.putMessage(String)中,检查自上次“获取”以来的时间。如果大于某个阈值,我们可以认为 SSE 通道已关闭。

还有这个类play.libs.F.EventStreamProducer.

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

于 2013-07-16T14:52:17.087 回答