問題:如何確定演員是否優雅地停止(例如,通過其父節點停止)還是通過異常停止?Akka DeathWatch - 找到終止的原因
語境:用以下臨終看護的設置我只在良好的測試中,我明確要求停止得到Terminated.class
消息。我預計只有在不好的情況下才會有Terminated.class
消息。使用supervisorStrategy來阻止拋出異常的孩子不會產生任何影響,因爲這會導致良好測試的行爲。在那裏,我無法找到一種方法來確定它是否是由異常引起的。
我的測試設置如下:
臨終看護
public class DeathWatch extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.matchAny(this::logTerminated)
.build();
}
private <P> void logTerminated(final P p) {
log.info("terminated: {}", p);
}
}
演員
public class MyActor extends AbstractActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.matchEquals("good", s -> { getContext().stop(self()); })
.matchEquals("bad", s -> { throw new Exception("baaaad"); })
.build();
}
}
測試
public class Test {
private TestActorRef<Actor> actor;
@Before
public void setUp() throws Exception {
actor = TestActorRef.create(ActorSystem.create(), Props.create(MyActor.class), "actor");
TestActorRef.create(ActorSystem.create(), Props.create(DeathWatch.class),"deathwatch").watch(actor);
}
@Test
public void good() throws Exception {
actor.tell("good", ActorRef.noSender());
}
@Test
public void bad() throws Exception {
actor.tell("bad", ActorRef.noSender());
}
}
更新:添加以下管理器,導致第二次「終止」日誌記錄,但不會產生更多上下文信息。
public class Supervisor extends AbstractActor {
private final ActorRef child;
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, s -> child.tell(s, getSelf()))
.build();
}
@Override
public SupervisorStrategy supervisorStrategy() {
return new OneForOneStrategy(DeciderBuilder.match(Exception.class, e -> stop()).build());
}
}
謝謝你的澄清。 「看看日誌。」可悲是不夠的,因爲我們希望在拋出異常時進行錯誤處理。我認爲唯一的辦法就是進一步升級到專門的異常處理主管。 – michaelbahr