2016-11-14 5 views
1

내가 어떤 상황과 배우가, 즉Akka 배우의 컨텍스트를 알 수있는 방법이 있습니까?

def step2: Receive = { 
    case _ => log error "Unhandled message" 
} 

def step1: Receive = { 
    case _ => log error "Unhandled message" 
} 

있는 배우가 현재 (1 단계, 2 단계)를 명시 알 수있는 방법이 있나요? (나는 string에 값을 재고 할 수 있지만 더 좋은 방법이 있는지 궁금합니다.)

이 상태가 어딘가에 보관되어야하므로 가능하지 않은 경우 이유를 이해하고 싶습니다.

+0

그것은 * 캡슐 *에 그것은 기능의 것 : http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html#Actor_Best_Practices – rethab

+0

미안하지만, 난 몰라 당신이 코멘트하는 것을 이해합니다. – Simon

답변

2

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" 
     } 
    } 
    } 


} 
+0

좋아, 아무도 다른 해결책을 제시하지 않으면 나는 당신의 대답을 받아 들일 것이다. 그러나이 상태는 어딘가에 보관되어야하고 배우가 접근 할 수 있어야한다. 그래서 그것을 얻을 수없는 이유는 무엇인가? – Simon

+0

@ Simon 당신은 액터 밖에서 액터 메시지 – pamu

+0

@ 사이먼을 사용하여 상태 데이터를 보낼 각 주마다 케이스를 가질 수 있습니다. FSM을 사용할 수 있습니다. – pamu