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));
}}
헤이 @johanandren이 변화 보호자의 감독 전략 가능하다? –
예, 문서에 언급되어 있습니다. 그러나 사용자 보호자 전략을 변경하는 대신 관리자 역할을하는 것이 좋습니다. – johanandren
멋지다. 변경 보호자 전략에 대해 언급하는 링크를 보내 주시겠습니까? 나는 더 많은 것을 탐험하기를 원합니다, 그건 유장이 보호자 전략을 바꾸려고합니다. –