【问题标题】:How to avoid re-running an actor in Akka?如何避免在 Akka 中重新运行一个演员?
【发布时间】:2014-11-10 03:39:39
【问题描述】:

我是 Akka 的新手。对于我正在使用 Play framework 2 的项目,我需要运行计划的作业。 为此,我正在使用一个 use


Akka.system().scheduler().schedule(Duration.create(5, TimeUnit.MINUTES),
                                   Duration.create(3, TimeUnit.HOURS),
                                   dailyImportActor,
                                   "import",
                                   Akka.system().dispatcher(),
                                   null);

演员正在做的工作是一项长期工作,可能需要 1-4 个小时。我的问题是这样的。如果演员仍然忙于工作,下一次的时间到了,会发生什么?演员会被重新塑造吗?它会在某处阻塞并排队并在后面运行吗? 谢谢!

【问题讨论】:

  • @ElectricCoffee 看起来他正在使用 Java,他仍然需要括号。

标签: java scala playframework-2.0 akka


【解决方案1】:

如果参与者仍然忙,消息将被排队。如果你想开始并行工作,你可以添加另一个演员来创建实际的工人。

【讨论】:

  • 为什么不未来/平行收藏?
【解决方案2】:

您只是每 3 小时向演员发送一条消息。如果演员“忙”,消息将在他的收件箱中排队。为避免消息排队,您应该使用here 所述的其他方法或变体:

class ScheduleInReceive extends Actor {
  import context._

  override def preStart() =
    system.scheduler.scheduleOnce(500 millis, self, "tick")

  // override postRestart so we don't call preStart and schedule a new message
  override def postRestart(reason: Throwable) = {}

  def receive = {
    case "tick" =>
      // send another periodic tick after the specified delay
      system.scheduler.scheduleOnce(1000 millis, self, "tick")
      // do something useful here
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多