【问题标题】:Akka cluster singleton as schedulerAkka 集群单例作为调度器
【发布时间】:2016-06-07 08:06:16
【问题描述】:

我正在使用 Akka 集群运行 Play。 我需要一个“单例调度程序”来每小时执行一些任务。

到目前为止,我发现我应该使用 ClusterSinglegonManager。 但我不确定我的演员应该是什么样子。 在我看来,我不需要“接收”方法。

也就是说,我如何实例化我的 Singleton:

system.actorOf(
  ClusterSingletonManager.props(
    singletonProps = MySingletonActor.props(configuration),
    terminationMessage = PoisonPill,
    settings = ClusterSingletonManagerSettings(system)),
  name = "mysingletonactor")

这很合适:

object MySingletonActor {
  def props(configuration: Configuration): Props = Props(new MySingletonActor(configuration))
}

class MySingletonActor(configuration: Configuration) extends Actor with ActorLogging {
  context.system.scheduler.schedule(2 seconds, 2 seconds)(println("Hallo Welt"))
  def receive = ???
}

但它当然会引发异常,因为缺少接收方法的实现。但它有效。

去这里最好的方式是什么? 只安排一个“Tick”并在接收方法中处理 Tick 感觉很尴尬......

class MySingletonActor(configuration: Configuration) extends Actor with ActorLogging {
  case object Tick
  context.system.scheduler.schedule(2 seconds, 2 seconds, self, Tick)
  def receive = { case Tick => println("Hallo Welt") }
}

Akka 中是否有任何类型的单例调度程序?

【问题讨论】:

    标签: scala playframework akka akka-cluster


    【解决方案1】:

    您可以使用Actor.emptyBehavior 来不引发异常,而不是将??? 作为接收方法。这是一个完全不匹配任何消息的接收表达式。

    【讨论】:

    • 如果你只想使用调度器,你可以直接从你的系统中使用它,调度你的消息并在参数中指定一个ActorRef,谁应该接收消息。唯一的好处是,您有一个可以接收消息以停止或取消计时器的单例参与者。
    • 我在应用启动时启动调度程序。我有类似 cron 作业的功能。因此,如果我在集群中启动 5 个应用程序,调度程序将启动 5 次。这正是我想要避免的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2019-04-13
    • 2020-12-09
    相关资源
    最近更新 更多