Akka:定时器问题

Akka: issue with Timer

我正在尝试创建 actor,它在计时器上执行一些操作。所以我寻求一种方法来安排演员消息给自己。

为此,我使用 Behaviors.withTimers

object Consumer {
     sealed trait Command
     private object Timeout extends Command
     private case object TimerKey

     def apply(): Behavior[Command] = {
            Behaviors.withTimers(timers => new Consumer(timers).idle())
     }
  }

方法 idle() 必须开始定期向自身发送超时消息。

  class Consumer(timers: TimerScheduler[Command]) {

       private def idle(): Behavior[Command] = {
           timers.startTimerWithFixedDelay(TimerKey, Timeout, FiniteDuration.apply(1, SECONDS))
           action()
           Behaviors.same
       }

       def action(): Behavior[Command] = {
             Behaviors.receiveMessage[Command] {
                case Timeout => println(" Consumer action done")
                Behaviors.same
         }
      }
    }

并且 action() 必须将此消息挂接到 Behavior[Command]。但这并没有发生。据我了解,由于某些原因,计时器没有启动。但那是什么原因呢?

计时器 正在 正在启动并且正在发送 Timeout 消息,但是您的 Consumer actor 没有处理它,因此 println 从不执行。

您的 applytimers 注入 Consumer。在 idle 中,您启动了计时器,然后调用 action 来构造一个新的 Behavior,但是您随后将其丢弃并实际使用了您的演员具有的 same 行为(不会回复任何消息)。

idle 可能应该按照这些行定义(我也在使用持续时间 DSL:import scala.concurrent.duration._

timers.startTimerWithFixedDelay(TimerKey, Timeout, 1.second)
action()