【问题标题】:Play Framework SSE Closing Chunked Response播放框架 SSE 关闭分块响应
【发布时间】:2013-07-11 01:02:45
【问题描述】:

我正在尝试在 Play Framework 1.2.5

中实现 Server-Side Events 服务器

我如何知道客户端是否调用了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,而只处理块。

【问题讨论】:

    标签: java playframework server-sent-events


    【解决方案1】:

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

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

    还有这个类play.libs.F.EventStream 可以在Producer 中使用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      相关资源
      最近更新 更多