【发布时间】:2017-06-22 14:37:27
【问题描述】:
问题:我怎样才能知道演员是被优雅地停止(例如通过其父停止)还是通过异常停止?
上下文:通过以下死亡观察设置,我只在良好测试中收到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());
}
}
【问题讨论】: