我的演员定义如下:
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
将匹配的内容?