首页 > 解决方案 > 如何添加重复计划以发送到 masterRegistryActor

问题描述

 def main(args: Array[String]): Unit = {

    val rootBehavior = Behaviors.setup[Nothing] { context =>
      val masterRegistryActor = context.spawn(Master(), "MasterActor")
      context.watch(masterRegistryActor)

      masterRegistryActor ! Master.Watchlist("TSLA")
      masterRegistryActor ! Master.Watchlist("NVDA")

      Behaviors.empty
    }

    implicit val system = ActorSystem[Nothing](rootBehavior, AppConfig.name)
    implicit val executionContext = system.executionContext

}

如您所见,我使用的是akka typed,我想了解如何执行以下操作:

  1. 如何在重复的时间范围内安排,目前我只能这样做:

    system.scheduler.scheduleOnce(50 毫秒, masterRegistryActor, Master.WatchList("AAPLE"))

我在 Behaviors.Setup 中执行此操作,由于某种原因 system.scheduler.schedule(...) API 不可用,为什么以及如何解决这个问题?

  1. 我的另一个困惑是,由于我的 masterRegistryActor 在我的 rootBehavior 中,我如何从外部引用它?我想让这个actor在我的整个应用程序中都可用,有点像根/全局actor,但这是我找到生成它的唯一方法。

标签: scalaakka

解决方案


让我们假设它Master实际上是 aBehavior[MasterMessage]并且定义如下

trait MasterMessage
case object RepeatMasterMessage extends MasterMessage

object Master {
  def apply[MasterMessage]() =
    Behaviors.setup { context => 
      // master behaviour
    }
}

然后,您可以将Master行为包装到Behaviors.withTimer.

trait MasterMessage
case object RepeatMasterMessage extends MasterMessage

case object RepeatMasterMessageTimerKey

object Master {
  def apply[MasterMessage]() =
    Behaviors.withTimer[MasterMessage] { timerScheduler =>

      timerScheduler.startTimerWithFixedDelay(
        RepeatMasterMessageTimerKey,
        RepeatMasterMessage,
        Duration(1, TimeUnit.SECONDS),
        Duration(5, TimeUnit.MINUTES)
      )

      Behaviours.setup[MasterMessage] { context => 
        // master behaviour
      }
    }
}


推荐阅读