我如何每5分钟执行一次Akka演员?

Eva*_* Y. 41 akka

我想知道Akka中是否有任何可以定期执行演员的机制?

小智 64

在Akka 1.3.1中你真的不需要演员这样做你可以安排一个每5分钟调用一次的函数,如下所示:

Scheduler.schedule(() => println("Do something"), 0L, 5L, TimeUnit.MINUTES)
Run Code Online (Sandbox Code Playgroud)

但是,如果你因为其他原因确实希望它成为一名演员,你可以这样称呼它

case class Message()

val actor = actorOf(new Actor {
  def receive = {
    case Message() => println("Do something in actor")
  }
}).start()

Scheduler.schedule(actor, Message(), 0L, 5L, TimeUnit.MINUTES)
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Akka 2.0,那么就可以这样做

val system = ActorSystem("MySystem")
system.scheduler.schedule(0 seconds, 5 minutes)(println("do something"))
Run Code Online (Sandbox Code Playgroud)

或者像这样每隔5分钟向演员发送一条消息

case class Message()
class MyActor extends Actor {
  def receive = { case Message() => println("Do something in actor") }
}

val system = ActorSystem("MySystem")
val actor = system.actorOf(Props(new MyActor), name = "actor")
system.scheduler.schedule(0 seconds, 5 minutes, actor, Message())
Run Code Online (Sandbox Code Playgroud)

  • Scheduler.schedule似乎不再存在 (3认同)
  • 请记住,您可能想知道上一次调用在5分钟后(至少在某些情况下)之前触发之前完成了它的过程。为此,您可以使用带有一些额外逻辑的`scheduleOnce`。 (2认同)

mat*_*its 22

使用计划的方法是一种很好的方法,尽管如果按计划完成的工作如此之大以至于可能需要比计划的时间间隔更长的时间,则消息可能排队.如果希望在一次迭代结束和下一次迭代开始之间发生间隔,则使用scheduleOnce以下模式:

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

class SchedulingActor extends Actor {

  override def preStart(): Unit = {
    self ! "Do Some Work"
  }

  def receive = {
    case "Do Some Work" => 
      doWork
      context.system.scheduler.scheduleOnce(5 minutes, self, "Do Some Work")
  }

  def doWork = ???
}
Run Code Online (Sandbox Code Playgroud)

  • 这是截至2016年的相关答案.Scheduler.schedule不再是有效的方法. (2认同)