安排重复事件 Akka

Schedule repeating event Akka

在 Akka 应用程序中,可以使用 context.system.scheduler.schedule 安排 Actor 在将来重复执行某些操作,然后传递一个 initialDelay,然后传递一个 interval。我希望间隔是随机的(即,如果我希望对泊松过程建模,则从指数分布中得出)。

如何使用 Akka Scheduler 安排事件在未来随机发生?

如果我正确理解你的问题,你希望能够在调度程序中调整间隔,这是不可能的,因为它当然是不可变的,但你可以使用 scheduleOnce 和随时调整延迟:

case object DoSomething

class MyActor() extends Actor {
  var delay = 10

  context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)

  def receive: Receive = {
    case DoSomething =>
      doSomething()
  }

  def doSomething(): Unit = {
    /** do something */
    delay = delay * 2
    context.system.scheduler.scheduleOnce(delay seconds, self, DoSomething)
    ()
  }
}

您可以安排一次该进程,它将触发 doSomething() 方法,该方法将以不同的延迟对另一个计划的作业进行排队。

这可以通过递归函数来完成:

def doSomething : Unit = ???

def randomIntervalGenerator : FiniteDuration = ???

@scala.annotation.tailrec
def randomSchedule(count : Int) : Unit = 
  if(count > 0) {
    Thread sleep randomIntervalGenerator.toMillis
    doSomething
    randomSchedule(count -1)
  }