Page History
...
Code Block | ||||
---|---|---|---|---|
| ||||
protected void supervisorTest(ActorSystem system,SpringExtension ext) throws Exception { new TestKit(system) {{ Props superprops = ext.props("Supervisor"); ActorRef supervisor = system.actorOf(superprops, "supervisor"); ActorRef probe = getRef(); //나쁜아이를 허용하는 전략으로 부모(감독)를 통해 아이를 생성합니다. final CompletableFuture<Object> future = PatternsCS.ask(supervisor, ext.props("BadChild") , 5000).toCompletableFuture(); ActorRef badChild = (ActorRef)future.get(); //나쁜아이의 상태를 42로 만든다... badChild.tell(42, ActorRef.noSender()); //나쁜아이의 상태를 물어보고, probe에 전달하도록한다 badChild.tell("get", probe); //prove에 저장된 메시지가 42인지 확인한다. expectMsgEquals(42); // ArithmeticException 예외는 그냥 진행하도록 정의를 하였다. badChild.tell( new ArithmeticException(), ActorRef.noSender() ); //아이가 살아있는지 확인... badChild.tell("get", probe); expectMsgEquals(42); // NullPointerException 예외는 아이를 다시 초기화하도록 정의하였다. badChild.tell( new NullPointerException(), ActorRef.noSender() ); //아이가 초기화 되었는지 확인 ( 초기상태 0) badChild.tell("get", probe); expectMsgEquals(0); //액터를 확인하기위한 Util 액터로, 죽은지 여부를 확인할수가 있습니다. TestProbe probe2 = new TestProbe(system); probe2.watch(badChild); // IllegalArgumentException 익센셥이 발생하면 아이를 보내기로 결정하였다. badChild.tell( new IllegalArgumentException(), ActorRef.noSender() ); // 아이가 사라진지 체크... probe2.expectMsgClass(Terminated.class); }}; } |
AkkaTest는 실제로 다양한 장애를 유발하여, Test코드를 통해서 어느정도 장애처리 모델에대한 검증이 가능합니다.
전통적인 Exception처리방법은 스택구조이기 때문에 아이에게 책임을 전가하면서 부모가 시도한 정보를 알수가 없어서 (예를들면 파일기록기는 Db접속정보를 알수가 없습니다.)
예외처리가 서비스코드와 뒤엉켜...심지어 서비스코드보다 더많은 코드량을 작성해야 하는 상황도 생기기도 합니다.
Akka에서는 그냥 액터를 죽게두고(Let It Crash) 감독자에의해 우아하게 복구할수 있는 다양한 장치를 제공합니다.
장애를 허용하고 복구한다는것은 실제는 어려운 주제입니다. 여기서는 가장
참고url: 여기 샘플은 SpringBoot과 연동하여 재구성되었습니다.