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已经很长)的情况下,这可能是"软泄漏"(即延迟清理).
看起来任务仍在运行,并且消息很可能最终变成死信。您可以通过以下代码示例查看该行为:
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 秒后,您将不再看到“已收到消息...”字符串被打印,但您将继续看到“正在执行”字符串被打印。然后,在我手动终止任务后,您将不再看到“已执行”被打印。
| 归档时间: |
|
| 查看次数: |
4316 次 |
| 最近记录: |