scala - 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
将匹配的东西?
解决方案
推荐阅读
- python - Pyodbc 无法连接 mysql 的驱动程序错误
- c# - 有没有更有效的方法在 C# 中生成 4000 万个字母数字唯一随机字符串
- lua - Lua 4最外层变量范围
- cypress - 从命令行运行 cypress 时在 Git for Windows bash 中获取奇怪的字符
- python - 如何将多个标志传递给熊猫中的字符串提取方法?
- node.js - Node JS db-migrate 用于不同的数据库
- javascript - 如何通过 AJAX 从 PHP 获取特定值到 Java Script 并将 div 始终保持在底部?
- c# - Microsoft Graph API:Httpclient 403 禁止错误
- react-native - 添加新组件时 React Native 组件松散排列
- java - Spring:在 Unittest 中回滚事务