2016-11-14 2 views
1

J'ai un acteur avec certains contextes, à savoirExiste-t-il un moyen de connaître le contexte d'un acteur Akka?

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

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

Y at-il un moyen de savoir sur quel état l'acteur est actuellement (étape 1, étape 2)? (Je pourrais stocker la valeur sur un string mais je me demande s'il y a un meilleur moyen.)

Si ce n'est pas possible, je voudrais comprendre pourquoi cet état devrait être conservé quelque part.

+0

Il est appelé * encapsulation * et il est une caractéristique: http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html#Actor_Best_Practices – rethab

+0

Je suis désolé mais je ne le font pas Comprenez vous commentez. – Simon

Répondre

2

EFM

Vous pouvez utiliser FSM. stateName donne le nom de l'état. Ping l'acteur avec un message spécial géré dans chaque état pour envoyer le nom d'état.

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 
} 

Hacky Solution

Acteur Akka ne stocke pas d'informations spécifiques sur la fonction partielle. Donc, je ne pense pas qu'il y aura une fonction akka lib facilement disponible pour cela.

Avoir state à l'intérieur de l'acteur, puis mettre à jour l'état lorsque l'acteur tente de devenir quelque chose.

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

Ok, si personne ne donne une autre solution, j'accepterai votre réponse, mais cet état doit être gardé quelque part et accessible par l'acteur, alors pourquoi n'est-il pas possible de l'obtenir? – Simon

+0

@Simon Vous pouvez avoir un cas dans chaque état qui enverra les données d'état en dehors de l'acteur en utilisant le message d'acteur – pamu

+0

@Simon vous pouvez utiliser FSM. – pamu