我在Play Framework中使用Akka而不是Job,来安排代码每X秒运行一次。我的代码在Heroku免费套餐上运行,我认为有时会暂停一段时间,然后由Heroku系统恢复。
有可能当Heroku dyno醒来时,它注意到它有一些“欠它”的事件,所以同时运行它们?我的代码不是线程安全的,并假设在任何给定时间只运行一个事件。
这是在Play start:
上运行的actor设置object Global extends GlobalSettings {
override def onStart(app: Application) {
val monitorActor = Akka.system.actorOf(Props[MonitorLoadJob], name = "monitorLoad")
Akka.system.scheduler.schedule(0 seconds, 10 seconds, monitorActor, Tick)
}
}
答案 0 :(得分:1)
Actors一次处理一条消息,因此如果您使用调度程序每隔10秒向monitorActor发送一条Tick消息,则monitorActor中该Tick消息的处理必须是顺序的 - 与消息是否迟到无关批量生产,或不批准。
如果你观察到并发行为,那么其他的东西就会出错。