【问题标题】:Server Sent Events don't work in Play Framework服务器发送的事件在 Play 框架中不起作用
【发布时间】:2014-08-09 15:52:26
【问题描述】:

以下代码在 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);
} );

【问题讨论】:

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


    【解决方案1】:

    您应该更改 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) 将数据推送到浏览器。请注意,在此示例中,通道是一个全局对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2020-11-04
      • 2022-01-16
      • 2013-09-08
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多