在我的主管演员中,由儿童演员发送一条消息,表明其已完成。然后我阻止这个演员 onReceive方法:
@Override
public void onReceive(Object msg) {
if (msg == Messages.SUCCESS) {
getContext().stop(getSender());
}
}
但是这会导致打印以下消息:
[INFO] [10/24/2014 12:12:43.102] [Main-akka.actor.default-dispatcher-6] [akka://Main/user/app/$l] Message [akka.dispatch.sysmsg.Terminate] from Actor[akka://Main/user/app/$l#1444168887] to Actor[akka://Main/user/app/$l#1444168887] was not delivered. [6] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
这是预期的行为吗?这些消息可以被忽略吗? 是否需要明确地停止该actor或者它是否会在其运行完成后停止并且有资格进行垃圾收集?
更新:需要显式停止一个actor,因为它不会被akka框架停止:
Akka: Cleanup of dynamically created actors necessary when they have finished?
答案 0 :(得分:0)
报告的演员(akka:// Main / users / app / $ 1#14441688887)已经观看了自己,因为它自己发送了Terminated消息。虽然这样做很好,但在这种情况下,您应该期望这个死信消息正常。
你问:
这是预期的行为吗?
是
可以忽略这些消息吗?
是。甚至可以通过在配置中将akka.log-dead-letters
设置为false来阻止它们。
是否需要显式停止该actor,或者它是否会在其运行完成后停止并有资格进行垃圾回收?
如果你希望它消失,你必须停止演员。执行此操作的常规方法是向其发送PoisonPill消息,该消息默认情况下会导致队列中的所有现有消息被处理,然后当达到PoisonPill时,该actor将被停止并被丢弃。