2012-03-15 37 views

回答

54

你并不真的需要一个演员要做到这一点在阿卡1.3.1你可以安排一个功能每5分钟被称为像这样:

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

但是,如果你希望它是其他原因一个演员如果你使用的阿卡2.0,那么你会这样称呼它

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) 

它会像这样

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()) 
+3

Scheduler.schedule似乎不存在了 – Phil 2016-05-13 13:54:16

+0

牢记你可能想知道前面的调用在新车在5分钟后起火之前完成其程序,至少在某些情况下是如此。你可以使用带有一些额外逻辑的'scheduleOnce'。 – matanster 2016-07-13 06:16:12

19

使用日程表的方法是一个很好的方法,虽然有对消息排队一个潜在的,如果按计划完成的工作是如此之大它可能需要比预定的时间间隔更长的时间。如果你想结束一个迭代的开始下一个之间发生的时间间隔,然后使用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 = ??? 
} 
+2

这是2016年的相关答案。Scheduler.schedule不再是有效的方法。 – Zee 2016-05-26 13:01:48

+0

难道你不能只使用'context.system.scheduler.schedule(...)'每5分钟发送一次消息给'self'吗?它看起来会更干净,并且不需要重写'preStart'。 – 2017-06-05 19:49:39

+0

@BranislavLazic不,不设置循环时间表的目的是避免向演员发送另一条消息,前提是处理逻辑需要超过每个预定消息之间的时间间隔的时间。通过scheduleOnce(),演员可以在需要的时间内完成任何需要的工作,然后在安全的情况下设置另一个时间表来发送未来消息给自己。对于某些情况,这可以避免死锁和其他并发问题。 – speby 2017-07-19 03:00:04

0

如果有人要的Java代码,然后他们可以这样做

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