FSM Akka Acctorでstashing/unstashingしたいと思います。私はどこにstash()
とunstashAll()
を置くべきかわからない。アクカFSM俳優隠しとアンダーシュート付き
Iは、以下の簡単な例を有する:初期状態はStateA
ある
import akka.actor.{ActorSystem, FSM, Props, Stash}
trait TestState
case object StateA extends TestState
case object StateB extends TestState
case class TestData()
case class MessageA(msg: String)
case class MessageB(msg: String)
case object ChangeState
class TestFSM extends FSM[TestState, TestData] with Stash {
startWith(StateA, TestData())
when(StateA) {
case Event(MessageA(msgA), _) =>
println(s"In StateA: $msgA")
stay()
case Event(ChangeState, _) =>
println("Changing state from A to B")
goto(StateB)
}
when(StateB) {
case Event(MessageB(msgB), _) =>
println(s"In StateB: $msgB")
stay()
}
whenUnhandled {
case Event(e, _) =>
println(s"Unhandled event: $e")
stay()
}
}
object TestFSM extends App {
val system = ActorSystem("test-system")
val actor = system.actorOf(Props[TestFSM])
actor ! MessageA("Apple 1")
actor ! MessageB("Banana 1")
actor ! MessageA("Apple 2")
actor ! ChangeState
actor ! MessageB("Banana 2")
}
を。 StateA
の場合、俳優はMessageA
のメッセージのみを処理する必要があります。他のタイプのメッセージ(ChangeState
を除く)を受信した場合は、それを隠す必要があります。メッセージChangeState
を受信すると、アクタはStateB
に変更されます。 StateA
からStateB
に変更すると、すべてのメッセージをアンシャッシュする必要があります。 StateB
の場合、俳優はMessageB
のメッセージのみを処理する必要があります。
これを達成するためにstash()
とunstashAll()
をどこで使用するのか正確にはわかりません。私はランニングに乗る
出力は次のようになります。私が見たい
In StateA: Apple 1
Unhandled event: MessageB(Banana 1)
In StateA: Apple 2
Changing state from A to B
In StateB: Banana 2
出力は次のようになります。
In StateA: Apple 1
In StateA: Apple 2
Changing state from A to B
In StateB: Banana 1
In StateB: Banana 2
どうもありがとうございました。
感謝を持っているなら、私を知ってみましょう:あなたは状態間のサイクルことができますので、私も小さな更新を行ってきました。 – Rohit
私はそれを聞いてうれしいよ:) –