2016-08-18 3 views
0

Akka 수명주기와 Akka 액터 감독 전략을 탐색 할 것입니다. 나는 내 자신의 예외를 만들고 있으며, akka의 수명주기와 복구 전략을 탐구하기위한 public SupervisorStrategy supervisorStrategy() 메서드를 재정의합니다. 나는 계속 EsclateException 로그를 던져 배우를 종료하지 않을 경우 receive() 방법에서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

멋지다. 변경 보호자 전략에 대해 언급하는 링크를 보내 주시겠습니까? 나는 더 많은 것을 탐험하기를 원합니다, 그건 유장이 보호자 전략을 바꾸려고합니다. –