首页 > 解决方案 > case msg 之间的 Scala Actor 区别:ByteString 和 case Received(msg)

问题描述

我有一个演员定义如下:

class ClientHandler(connection: ActorRef) extends Actor {

  def receive = {
    case Received(data) => {

      val clientId = data.utf8String.stripLineEnd
      Connector.saveConnection(clientId, self)

      context.become {

       case msg: ByteString => connection ! Write(msg)   

       case Received(msg) => connection ! Write(msg)

      }

    }
    case None =>
  }

}

有一个父 Actor 正在侦听想要连接到 TCP 服务器的客户端。一旦客户端连接,父参与者实例化 aClientHandler并为其提供原始连接,以便ClientHandler可以直接与连接的客户端对话。

还有另一个向客户端推送通知的参与者。该actor通过连接器通过ID查找客户端,连接器返回ActorRef一个实例,ClientHandler然后使用!运算符发送一个字节字符串。像这样:

val clientConn = Connector.getConnection(userId)
clientConn match {
  case Some(conn) => conn ! payload
  case None =>
}

我很确定,每当推送这样的通知时,我都可以ClientHandler使用块case Received(msg)内的接收它become,但它不起作用。取而代之的是case msg: ByteString作品,但我不明白为什么以及这两者之间的区别是什么。

我阅读了该Received方法的文档,它说Whenever data are read from a socket...这是否意味着该Received方法仅在远程客户端写入某些内容(因为他写入套接字)时才匹配,但是当另一个参与者(在这种情况下是在同一机器;如果不是到套接字,这个写入会去哪里?)写入case msg: ByteString将匹配的东西?

标签: scalaakkaactor

解决方案


推荐阅读