大小写msg:ByteString和大小写已接收(msg)之间的Scala Actor差异

时间:2018-10-30 22:38:30

标签: scala akka actor

我的演员定义如下:

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 =>
  }

}

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

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

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将匹配的内容?

0 个答案:

没有答案