Java / Akka在这里。我有以下演员:
public class MyActor extends AbstractActor {
private Logger log = LoggerFactory.getLogger(this.getClass());
public MyActor() {
super();
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Init.class, init -> {
log.info("Sending myself a Poison Pill...");
self().tell(PoisonPill.getInstance(), self());
}).match(PoisonPill.class, poisonPill -> {
log.info("Got the Poison Pill...");
context().system().terminate();
}).build();
}
}
当它收到Init
消息时,我看到以下日志语句写成:
Sending myself a Poison Pill...
但是我从不看到:
Got the Poison Pill...
此外,该应用只是坐在那里,并没有按预期关闭。我在使用self().tell(PoisonPill.getInstance(), self())
时有什么阻止它接收消息并关闭的方法?
答案 0 :(得分:5)
由于PoisonPill
是AutoReceivedMessage
,因此不会显示日志消息。 AutoReceivedMessage
是Akka内部处理的一种特殊类型的消息,并不是要在用户代码中进行模式匹配。
一旦actor被“毒化” /停止,关闭actor系统的一种方法是重写actor的postStop()
方法:
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Init.class, init -> {
log.info("Sending myself a Poison Pill...");
self().tell(PoisonPill.getInstance(), ActorRef.noSender());
})
.build();
}
@Override
public void postStop() {
getContext().getSystem().terminate();
}