2
FSM Akka Acctor로 은근하게하고 싶습니다. 나는 stash()
과 unstashAll()
을 넣을 곳을 모른다.Akka FSM 배우 숨기기 및 빗대김으로
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
이다
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
나는 듣고있어 기뻐요 :) –