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));
}}
Hey @johanandren est-il possible pour le changement stratégie de surveillance de gardien? –
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
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. –