【问题标题】:Scheduling reset every 24 hours at midnight计划在午夜每 24 小时重置一次
【发布时间】:2013-11-05 08:56:47
【问题描述】:

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

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

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

【问题讨论】:

  • 仅供参考:持续时间 DSL 支持hours,因此请随意使用24 hours 而不是86400000 milliseconds ;)
  • 我试过了,但它抱怨工作时间
  • 类型不匹配; found : Int(24) required: ?{def hours: ?} 请注意,隐式转换不适用,因为它们不明确:在 (n: Int)com.github.nscala_time.time.RichInt 类型的 trait IntImplicits 中的方法 RichInt 和(n: Int)concurrent.duration.DurationInt 类型的包持续时间中的方法 DurationInt 是从 Int(24) 到 ?{def hours: ?} 的可能转换函数

标签: akka scala-2.10 playframework-2.2


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,此解决方案不是 DST 安全的。你好,从 2019 年开始。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多