2016-08-18 1 views
0

Je vais explorer Akka cycle de vie et Akka stratégies de supervision des acteurs. Je crée mes propres exceptions et remplace la méthode public SupervisorStrategy supervisorStrategy() pour explorer le cycle de vie d'Akka et leurs stratégies de récupération. Voici mon code:Akka: stratégies de supervision Akka personnalisé non enregistré en utilisant Java

public class JavaActor extends AbstractActor { 

@Override 
public PartialFunction<Object, BoxedUnit> receive() { 
    System.out.println("---- In the receive method "+Thread.currentThread().getName()); 
    return ReceiveBuilder. 
      matchEquals("Ping" , s -> { 
       System.out.println("$$$ Ping Match Successfully"); 
       throw new EsclateException("Might be esclate"); 
      }). 
      matchAny(x -> { 
       System.out.println("### Matched value is : "+ x); 
       sender().tell(new Status.Failure(new Exception("unknown message")), self()); 
      }).build(); 
} 

@Override 
public void preRestart(Throwable reason, Option<Object> message) throws Exception { 
    super.preRestart(reason, message); 
    System.out.println(">>> Actor preRestart method calls : "+Thread.currentThread().getName()); 
} 

@Override 
public void postRestart(Throwable reason) throws Exception { 
    super.postRestart(reason); 
    System.out.println(">>> Actor postRestart method calls : "+Thread.currentThread().getName()); 
} 

@Override 
public void preStart() throws Exception { 
    super.preStart(); 
    System.out.println(">>> Actor preStart method calls "+Thread.currentThread().getName()); 
} 

@Override 
public void postStop() throws Exception { 
    super.postStop(); 
    System.out.println(">>> Actor postStop method calls "+Thread.currentThread().getName()); 
} 

@Override 
public SupervisorStrategy supervisorStrategy() { 
    System.out.println("**** SupervisorStrategy Override Successfully ****"); 
    return new OneForOneStrategy(5, Duration.create(1, TimeUnit.MINUTES), 
      DeciderBuilder.match(ResumeException.class, e -> SupervisorStrategy.resume()) 
      .match(RestartException.class, e -> SupervisorStrategy.restart()) 
      .match(StopException.class, e -> SupervisorStrategy.stop()) 
      .match(EsclateException.class, e -> SupervisorStrategy.escalate()) 
      .matchAny(e -> SupervisorStrategy.escalate()).build()); 

}} 

Dans la méthode quand je jette les EsclateException les journaux continue et l'acteur doit pas se terminer. Mais quand je remplace le code d'exception par throw new Error(), les acteurs arrêtent le travail et se terminent. A partir de la sortie, il semble que mon SupervisorStrategy pas enregistré et les acteurs s'exécutent par défaut SupervisorStrategy. Comment puis-je enregistrer mes stratégies?

Ci-dessous mon code d'appel:

public class JavaActorTest { 

public static ActorSystem system; 

@BeforeClass 
public static void start() { 
    system = ActorSystem.create("ActorLifeCycleTest"); 
} 

@AfterClass 
public static void cleanup() { 
    JavaTestKit.shutdownActorSystem(system); 
    system = null; 
} 

@Test 
public void testActorCreation(){ 
    TestActorRef<JavaActor> actorRef = TestActorRef.create(system, Props.create(JavaActor.class)); 
    actorRef.tell("Ping", ActorRef.noSender()); 
    assertThat(true, is(true)); 
}} 

Répondre

2

Un acteur est supervisé par son parent non par lui-même, de sorte que le supervisorStrategy de son acteur mère est ce qui sera appliqué quand un acteur échoue.

Dans votre échantillon, vous n'incluez pas de parent de sorte que la supervision de l'utilisateur tuteur légal est appliquée.

Vous pouvez lire plus sur la surveillance dans les docs ici: http://doc.akka.io/docs/akka/2.4/general/supervision.html#supervision

+0

Hey @johanandren est-il possible pour le changement stratégie de surveillance de gardien? –

+0

Oui, il est mentionné dans les docs. Mais je vous recommande de présenter votre propre acteur superviseur au lieu de changer la stratégie de l'utilisateur gardien. – johanandren

+0

c'est cool, pouvez-vous s'il vous plaît envoyer le lien, où ils mentionnent pour la stratégie de gardien de changement? Je veux juste explorer plus, c'est du petit lait essayant de changer la stratégie de gardien. –