Подтвердить что ты не робот

Как я могу аккомпанировать акке каждые 5 мин?

Я хотел бы знать, есть ли какой-либо механизм в Акке, который может периодически выполняться актером?

4b9b3361

Ответ 1

Вам не нужен актер, чтобы сделать это в Akka 1.3.1, вы можете назначить функцию, которая будет вызываться каждые 5 минут, как это:

Scheduler.schedule(() => println("Do something"), 0L, 5L, TimeUnit.MINUTES)

Однако, если вы хотите, чтобы он был актером по другим причинам, вы бы назвали его так:

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)

Если вы используете Akka 2.0, тогда это будет сделано так:

val system = ActorSystem("MySystem")
system.scheduler.schedule(0 seconds, 5 minutes)(println("do something"))

Или отправить сообщение актеру каждые 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())

Ответ 2

Подход с использованием расписания - один хороший подход, хотя существует вероятность того, что сообщения будут стоять в очереди, если работа, выполненная по расписанию, настолько велика, что может занять больше времени, чем запланированный интервал. Если вы хотите, чтобы интервал выполнялся между окончанием одной итерации и началом следующего, используйте 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 = ???
}

Ответ 3

Если кому-то нужен Java-код, они могут сделать это следующим образом:

    Cancellable cancellable = system.scheduler().schedule(Duration.Zero(), Duration.create(5, TimeUnit.MINUTES), cronActor, "tick", system.dispatcher(), null);