Я хотел бы знать, есть ли какой-либо механизм в Акке, который может периодически выполняться актером?
Как я могу аккомпанировать акке каждые 5 мин?
Ответ 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);