FSM
당신은 FSM
를 사용할 수 있습니다. stateName
은 주 이름을 제공합니다.
stateName을 보내기 위해 모든 상태에서 처리되는 특별한 메시지를 사용하여 액터에 핑합니다.
sealed trait ExampleState
case object State1 extends ExampleState
case object State2 extends ExampleState
case object C extends ExampleState
import akka.actor.{Actor, FSM}
import akka.event.EventHandler
import akka.util.duration._
case object Move
class ABC extends Actor with FSM[ExampleState, Unit] {
import FSM._
startWith(State1, Unit)
when(State1) {
case Ev(Move) =>
EventHandler.info(this, "Go to B and move on after 5 seconds")
goto(state2) forMax (5 seconds)
}
when(State2) {
case Ev(StateTimeout) =>
EventHandler.info(this, "Moving to C")
goto(C)
}
when(C) {
case Ev(Move) =>
EventHandler.info(this, "Stopping")
stop
}
initialize // this checks validity of the initial state and sets up timeout if needed
}
해키 솔루션
Akka 배우가 PartialFunction에 대한 특정 정보를 저장하지 않습니다. 그래서 나는 이것을 위해 쉽게 사용할 수있는 akka lib 기능이있을 것이라고 생각하지 않습니다.
액자 안에 state
이 있고 액터가 무언가가 되려고 할 때 상태를 업데이트합니다.
class FooBar extends Actor with ActorLogging {
var state: Option[String] = Some("receive")
override def receive: Receive = {
case _ => context become state1()
}
def state1:() => Receive = {
() => {
state = Some("state1")
{
case _ => log error "ignore"
}
}
}
def state2:() => Receive = {
() => {
state = Some("state2")
{
case _ => log error "ignore"
}
}
}
}
그것은 * 캡슐 *에 그것은 기능의 것 : http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html#Actor_Best_Practices – rethab
미안하지만, 난 몰라 당신이 코멘트하는 것을 이해합니다. – Simon