2016-08-18 10 views
0

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)); 
}} 

答えて

2

俳優がいない、それ自体で、親が監修し、その親俳優のsupervisorStrategyは俳優が失敗したときに適用されるものです。

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

現在のドキュメントで監督についての詳細を読むことができます:http://doc.akka.io/docs/akka/2.4/general/supervision.html#supervision

+0

@johanandrenねえ変更守護監督の戦略のための、それは可能ですか? –

+0

はい、ドキュメントに記載されています。しかし、私は、あなたのスーパーガイダンスの俳優を紹介することをお勧めします。 – johanandren

+0

それは素晴らしいです、あなたは変更ガーディアン戦略について言及しているリンクを送ってください。私はもっ​​と探検したい、ホエーは保護者戦略を変えようとしている。 –

関連する問題