我试图创建一个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]挂钩。但这并没有发生。据我所知,由于某些原因,计时器没有启动。但这是什么原因呢?
1条答案
按热度按时间b09cbbtk1#
计时器 * 正在 * 启动,并且
Timeout
消息正在发送,但是您的Consumer
参与者没有处理它,因此println
永远不会执行。apply
将timers
注入到Consumer
中,在idle
中,您启动计时器,然后调用action
来构造一个新的Behavior
,但您随后将其丢弃,并实际使用演员所具有的same
行为(它不会响应任何消息)。idle
可能应该沿着以下方式定义(我还使用了duration DSL:(一月一日)