是否需要明确阻止Akka演员担任主管?

时间:2014-10-24 11:16:40

标签: java scala akka

在我的主管演员中,由儿童演员发送一条消息,表明其已完成。然后我阻止这个演员 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?

1 个答案:

答案 0 :(得分:0)

报告的演员(akka:// Main / users / app / $ 1#14441688887)已经观看了自己,因为它自己发送了Terminated消息。虽然这样做很好,但在这种情况下,您应该期望这个死信消息正常。

你问:

  

这是预期的行为吗?

  

可以忽略这些消息吗?

是。甚至可以通过在配置中将akka.log-dead-letters设置为false来阻止它们。

  

是否需要显式停止该actor,或者它是否会在其运行完成后停止并有资格进行垃圾回收?

如果你希望它消失,你必须停止演员。执行此操作的常规方法是向其发送PoisonPill消息,该消息默认情况下会导致队列中的所有现有消息被处理,然后当达到PoisonPill时,该actor将被停止并被丢弃。