Akka
ライフサイクルとAkka
アクター監督戦略を探そうとしています。私は自分自身の例外を作成し、akkaのライフサイクルとその回復戦略を調べるためにpublic SupervisorStrategy supervisorStrategy()
メソッドをオーバーライドしています。私は続けてEsclateException
ログを投げると俳優を終了していないとき方法でAkka:Javaを使用して登録されていないカスタムakka監督戦略
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());
}}
:以下は、私のコードです。しかし、例外コードをthrow new Error()
に置き換えると、アクターは作業を中止して終了します。出力からは、私のSupervisorStrategy
は登録されておらず、俳優はデフォルトでSupervisorStrategy
で実行されているようです。私の戦略を登録するには?
以下は私の呼び出し元のコードです:
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));
}}
@johanandrenねえ変更守護監督の戦略のための、それは可能ですか? –
はい、ドキュメントに記載されています。しかし、私は、あなたのスーパーガイダンスの俳優を紹介することをお勧めします。 – johanandren
それは素晴らしいです、あなたは変更ガーディアン戦略について言及しているリンクを送ってください。私はもっと探検したい、ホエーは保護者戦略を変えようとしている。 –