0

Akkaライフ サイクルとアクターAkkaの監督戦略について説明します。public SupervisorStrategy supervisorStrategy()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());

}}

receive()ログをスローするメソッドではEsclateException、アクターを終了せずに続行します。しかし、例外コードを に置き換えると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));
}}
4

1 に答える 1

2

アクターは、それ自体ではなく親によって監視されるためsupervisorStrategy、アクターが失敗したときにその親アクターの が適用されます。

あなたのサンプルでは、​​あなた自身の親を含めていないので、ユーザー ガーディアン アクターの監督が適用されます。

スーパービジョンの詳細については、こちらのドキュメントを参照してください: http://doc.akka.io/docs/akka/2.4/general/supervision.html#supervision

于 2016-08-18T14:04:43.093 に答える