俳優の章のakka の本で3。メッセージ イベントを使用して、サイレント アクターの状態をテストします。
アクターは次のとおりです。
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
使用するのではなく、アクターの内部状態を取得するためにイベント テル アクターを使用する必要があります。internalState
GetState
同時実行の問題が発生する理由と、使用によって問題を解決できる理由がわかりません
説明
slientActor.internalState
内部変数をそのまま取得することはできません。インスタンスを使用silentActor.underlyingActor.internalState
すると取得できます。ひどい質問で申し訳ありません。