立即从play的WebSocket发送消息

时间:2013-07-04 14:43:56

标签: scala playframework

我正在尝试在建立连接后立即向websocket发送消息。但我不知道,将代码放在哪里发送消息。

def ws = WebSocket.async[String] {
    val (out, channel) = {
        Concurrent.broadcast[String]
    }
    channel push "message"
    request =>
        (in, out)
}

我可以看到,当我在ws方法返回之前将消息发送到频道时,Web客户端不会收到消息。如果我在方法channel push "message"返回后设法运行代码ws,它工作正常,我在浏览器客户端收到消息。我可以将channel push "message"包裹在Future{}中,从一些Thread.sleep()开始,将其推迟。

但我希望,有一些可靠,无阻塞的解决方案......

1 个答案:

答案 0 :(得分:2)

我从文档中看到async期望lambda返回Promise[stuff]

假设(in, out)被隐式转换为所述Promise,你可以尝试显式创建promise并注册一个监听器,如

def ws = WebSocket.async[String] {
    val (out, channel) = {
        Concurrent.broadcast[String]
    }
    request =>
      val p = Promise((in, out))
      p.onRedeem(_ => channel push "message")
      p
}

我没玩!这里的专家,所以我只是在猜测。