我正在尝试在 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
处理块。答案 0 :(得分:0)
由于play.mvc.Controller
不让我知道输出流是否在执行期间关闭,我通过Producer
本身解决了问题:
Producer.getNextMessage()
中,记住当前时间。Producer.putMessage(String)
中,检查自上次“获取”以来的时间。如果它大于某个阈值,我们可以认为SSE通道已关闭。此课程play.libs.F.EventStream
也可以在Producer
内使用。
另外,Producer
可能不是正确的名称,因为它更像是一个调度队列......