在我的主管演员中,子演员发送了一条消息以指示其完成。然后,我在onReceive方法中停止此actor:
@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还是将其运行到完成后才停止并有资格进行垃圾回收?
更新:由于akka框架不会阻止actor,因此必须明确停止actor:
所报告的演员(akka:// Main / users / app / $ 1#14441688887)自从发出终止消息后就开始监视自己。这样做很好,但是在这种情况下,您应该希望此死信消息像往常一样。
你问:
这是预期的行为吗?
是的。
这些消息可以忽略吗?
是的。甚至可以通过akka.log-dead-letters
在配置中将其设置为false来防止它们。
是否需要明确停止actor还是将其运行到完成后才停止并有资格进行垃圾回收?
如果希望演员消失,则必须停止演员。这样做的通常方法是向其发送PoisonPill消息,默认情况下,该消息会导致队列中所有现有的消息都得到处理,然后在到达PoisonPill时,actor将停止并被丢弃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句