在演员第三章的阿卡书中。它使用消息事件来测试静默演员的状态。
演员是这样的:
object SilentActorProtocol {
case class SilentMessage(data: String)
case class GetState(receiver: ActorRef)
}
class SilentActor extends Actor {
import SilentActorProtocol._
var internalState = Vector[String]()
def receive = {
case SilentMessage(data) =>
internalState = internalState :+ data
case GetState(receiver) => receiver ! internalState
}
}
测试代码如下:
"change internal state when it receives a message, multi" in {
import SilentActorProtocol._
val silentActor = system.actorOf(Props[SilentActor], "s3")
silentActor ! SilentMessage("whisper1")
silentActor ! SilentMessage("whisper2")
silentActor ! GetState(testActor)
expectMsg(Vector("whisper1", "whisper2"))
}
内部测试代码为什么使用 GetState 获取上述SilentMessage
事件的结果。
为什么不slientActor.internalState
直接使用得到结果呢?
更新
有些朋友似乎误导了我的问题。详细的,书上说
使用
internalState
变量会遇到并发问题,所以应该使用GetState
事件告诉actor获取actor的内部状态而不是internalState
直接使用。
不知道为什么会遇到并发问题,为什么使用GetState
可以解决问题
解释
slientActor.internalState
无法直接获取内部变量,请理解,使用silentActor.underlyingActor.internalState
可以得到它。非常抱歉这个可怕的问题。