1

我有一个计数器“numberOrders”,我想每天午夜重置它,以了解我一天收到多少订单,我现在拥有的是:

val system = akka.actor.ActorSystem("system")
system.scheduler.schedule(86400000 milliseconds, 0 milliseconds){(numberOrders = 0)}

这段代码在一个 def 中,每次我收到新订单时都会调用它,所以想要它做的是:从第一个订单或每个订单开始 24 小时后重置 numberOrders,我不确定是否每次都有新订单订单将在 24 小时后重置,这不是我想要的。我想每天午夜休息变量,知道吗?谢谢!

4

2 回答 2

2

进一步增加爱出风头的答案。由于您可能并不总是确定站点何时启动,并且如果您想完全确定它在午夜运行,您可以执行以下操作

val system = akka.actor.ActorSystem("system")
val wait = (24 hours).toMillis - System.currentTimeMillis
system.scheduler.schedule(Duration.apply(wait, MILLISECONDS), 24 hours, orderActor, ResetCounterMessage)

可能不是最整洁的解决方案,但它可以完成工作。

于 2013-11-12T08:56:55.920 回答
1

由于 schedule 支持重复执行,您只需将 interval 参数设置为 24 小时,将初始延迟设置为从现在到午夜之间的时间量,并在启动时启动代码。您现在每次收到订单时似乎都在创建一个新的actorSystem,这似乎不太正确,您也将摆脱它。

另外,我建议使用 schedule 方法来代替向参与者发送消息。这样,处理订单的参与者可以保持计数,如果它收到 ResetCounter 消息,它将简单地重置计数器。你可以简单地写:

 system.scheduler.schedule(x seconds, 24 hours, orderActor, ResetCounterMessage)

当您最初启动您的演员系统并完成它时。

于 2013-11-05T10:43:58.047 回答