Akka:计时器问题

vatpfxk5  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(223)

我试图创建一个actor,它在定时器上执行一些动作。所以我寻找一种方法来调度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()必须以固定间隔开始向自身发送消息Timeout。

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]挂钩。但这并没有发生。据我所知,由于某些原因,计时器没有启动。但这是什么原因呢?

b09cbbtk

b09cbbtk1#

计时器 * 正在 * 启动,并且Timeout消息正在发送,但是您的Consumer参与者没有处理它,因此println永远不会执行。
applytimers注入到Consumer中,在idle中,您启动计时器,然后调用action来构造一个新的Behavior,但您随后将其丢弃,并实际使用演员所具有的same行为(它不会响应任何消息)。
idle可能应该沿着以下方式定义(我还使用了duration DSL:(一月一日)

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

相关问题