【问题标题】:How is state managed in Scala Play! 2.0 Websockets?Scala Play 中如何管理状态! 2.0 网络套接字?
【发布时间】:2012-12-11 01:56:55
【问题描述】:

我正在查看https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat 的示例

要制作一个 websocket 控制器,你可以这样写:

def chat(username: String) = WebSocket.async[JsValue] { request  =>
    ChatRoom.join(username)
}  

Chatroom.join 返回一个 scala.concurrent.Future[(Iteratee[JsValue,_],Enumerator[JsValue])] 。但是 Play 中使用的迭代器和枚举器在哪里!框架? WebSocket 类(WebSocket.scala)似乎忽略了输入:

case class WebSocket[A](f: RequestHeader => (Enumerator[A], Iteratee[A, Unit]) => Unit)        (implicit val frameFormatter: WebSocket.FrameFormatter[A]) extends Handler {

  type FRAMES_TYPE = A

  /**
   * Returns itself, for better support in the routes file.
   *
   * @return itself
   */
   def apply() = this
}

怎么玩!在 iteratee 消耗输入时管理不断变化的状态?

【问题讨论】:

    标签: scala websocket playframework-2.0 enumerator iterate


    【解决方案1】:

    值得注意的是,WebSocket 本身只是一个愚蠢的容器。魔法发生在play.core.server.netty 内的各个类中。

    要了解这个魔法是什么,看一下 f 的签名(WebSocket 包含的函数:

    RequestHeader => (Enumerator[A], Iteratee[A, Unit]) => Unit
    

    这是一个接受 RequestHeaderEnumeratorIteratee 的函数,并对它们进行处理。

    因此,在未来的某个时候,框架将为我们的WebSocket 提供RequestHeader(应该是不言自明的),Enumerator[A](枚举器是源,在这种情况下,这些是消息从客户端接收)和一个Iteratee[A, Unit](Iteratees 是接收器,在这种情况下,这是我们将消息发送回客户端的地方)。

    对于WebSocket.adapter,WebSocket 将通过EnumerateeEnumerator 连接到Iteratee。对于WebSocket.using,WebSocket 会将远程Enumerator 连接到本地Iteratee,并将删除Iteratee 连接到本地Enumerator

    与直接定义 WebSocket 相比,使用WebSocket 对象中的一种便捷方法可能更容易。以下代码将回显之前收到的消息:

      def mySocket = WebSocket.adapter {implicit req =>
        var lastMessage = "No previous message"
        Enumeratee.map[String] {msg =>
          val response = lastMessage
          lastMessage = msg
          response
        }
      }
    

    请注意,这段代码几乎肯定存在线程安全问题 - 在 Scala 中,您应该尽可能避免可变状态,或者如果没有,则使用 actor 或类似的。

    或者,试试WebSocket.using,看看pushee Enumerator,结合foreach Iteratee,虽然它有点小问题。也许可以理解,Playee 枚举器在 Play 2.1 中已被弃用,因为它已被新的通道系统取代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-12
      • 2011-08-15
      • 2012-07-15
      • 2018-05-18
      • 2013-03-18
      • 2015-12-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多