Play框架中无法正常使用服务器发送事件(Server Sent Events)。

3
以下代码在Play框架2.3中无法工作:
controllers.NotificationHandler.sendNotification():
 def sendNotification = Action {
    request =>
      val currentdate = new java.util.Date()
      Ok("data: " + currentdate.toString())
        .as( "text/event-stream")
        .withHeaders("Content-Type"->"text/event-stream")
        .withHeaders("Cache-Control"->"no-cache")
        .withHeaders("Connection"->"keep-alive")
 }

JS代码:

代码:

var event = new EventSource("@controllers.NotificationHandler.sendNotification()");
event.addEventListener('message', function( event ) {
    alert(event.data);
} );
1个回答

4
你应该将js部分更改为使用路由到控制器,而不是直接使用控制器本身:
var event = new EventSource("@routes.NotificationHandler.sendNotification()");
   event.addEventListener('message', function( event ) {
       alert(event.data);
   }  
);

您的控制器似乎不需要SSE,因为它只发送一个值,更完整的示例是创建枚举器并使用它来发送SSE,如下所示:

def sendNotification = Action{
   val producer = Enumerator.generateM[String](Promise.timeout(Some(Random.nextString(5)),3 second))
   Ok.chunked(producer &> EventSource()).as("text/event-stream")
}

一旦消息可用,您可以使用 Concurrent.broadcast 发送消息

val (producer,channel) = Concurrent.broadcast[String]
def sendNotification = Action{
       Ok.chunked(producer &> EventSource()).as("text/event-stream")
    }

然后使用 channel.push(yourData) 将数据推送到浏览器。请注意,此示例中的 channel 是全局对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接