以下代码不适用于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);
} );
答案 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)将数据推送到浏览器。请注意,在此示例通道中是一个全局对象。