停止演员里面的Akka演员

时间:2015-10-02 15:38:44

标签: java scala akka actor

我有一个演员,打算做一个长时间运行的工作而不再收到任何消息:

    actor {
       def receieve => longRunningJob()
    }

如何调试杀死此演员?

我已经按照文档说明"在演员中,你可以通过使用上下文引用来阻止子演员:"

    context.stop(childActor)

我还尝试向孩子发送Kill消息,Stop消息和PoisonPill消息,但是在长时间运行的工作过程中没有任何东西停止。

1 个答案:

答案 0 :(得分:6)

并不是说停止演员失败,就像Actors永远不会有机会处理与停止演员相关的消息一样。参与者是设计上的单线程,应该构造成尽可能少地阻塞消息循环。

在这种情况下,您真正​​要求的是"如何中断线程" ,因为longRunningJob似乎是一个单线程,阻塞,时间密集型任务答案是,确实没有好办法

进入"处理长时间运行的作业" 状态的Actor应该在不阻塞消息循环本身的情况下这样做,或者让作业本身是异步的(离开如果演员被停止,它会孤立并运行)或者作业本身由许多小步骤组成,每个步骤都会触发下一步,并返回一条消息,以便a)您可以接收其他消息并且b)有机会在中途打断工作。