服务器已发送事件在Play Framework中不起作用

时间:2014-08-09 15:52:26

标签: playframework server-sent-events playframework-2.3

以下代码不适用于Play framework 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 个答案:

答案 0 :(得分:4)

您应该更改js部分以使用路径到您的控制器而不是自己的控制器:

var event = new EventSource("@routes.NotificationHandler.sendNotification()");
   event.addEventListener('message', function( event ) {
       alert(event.data);
   }  
);

您的控制器似乎不需要SSE,因为它只发送一个值,更完整的例子是创建一个enumertaor并用它来发送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)将数据推送到浏览器。请注意,在此示例通道中是一个全局对象。