使用Akka中的默认调度程序,我是否需要在目标actor停止时手动取消事件?

Sof*_*mes 8 scheduling akka cancellation

当在默认的Akka系统调度程序(context().system().scheduler().schedule()来自actor内部)上使用方法,以及接受目标actor的重载之一时,我是否需要使用返回的Cancellable显式取消以在目标actor停止时释放资源?

我想调度程序可能是watch()目标actor并自动执行清理但无法在文档中的任何位置找到它.

Rol*_*uhn 11

的变体Scheduler.schedule,其采取的ActorRef将不看的是演员(这将具有相当高的开销相对于计时器任务是什么),因此,你应该经常清理从演员的重复计时器postStop钩.

在当地的情况下,我们检查target.isTerminated,但该方法总是返回false对于演员的引用它们是沼泽标准的本地种没有,因此你只能在特定的情况下,依靠这个功能,然后你的代码将停止正常工作,当你达到了你应用.另一个考虑因素是上述检查在尝试发送消息时运行,在长时间表(取决于用例100ms已经很长)的情况下,这可能是"软泄漏"(即延迟清理).


cmb*_*ter 3

看起来任务仍在运行,并且消息很可能最终变成死信。您可以通过以下代码示例查看该行为:

import akka.actor._
import scala.concurrent.duration._

object SchedTest {
  def main(args: Array[String]) {
    val sys = ActorSystem("test")
    val ref = sys.actorOf(Props[MyActor])

    val can = sys.scheduler.schedule(1 second, 1 second){
      println("executing")
      ref ! "foo"
    }(sys.dispatcher)

    Thread.sleep(10000)
    sys.stop(ref)
    Thread.sleep(5000)
    can.cancel
  }
}


class MyActor extends Actor{
  def receive = {
    case _ => 
      println("received message...")
  }
}
Run Code Online (Sandbox Code Playgroud)

10 秒后,您将不再看到“已收到消息...”字符串被打印,但您将继续看到“正在执行”字符串被打印。然后,在我手动终止任务后,您将不再看到“已执行”被打印。