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
从不执行。
您的 apply
将 timers
注入 Consumer
。在 idle
中,您启动了计时器,然后调用 action
来构造一个新的 Behavior
,但是您随后将其丢弃并实际使用了您的演员具有的 same
行为(不会回复任何消息)。
idle
可能应该按照这些行定义(我也在使用持续时间 DSL:import scala.concurrent.duration._
)
timers.startTimerWithFixedDelay(TimerKey, Timeout, 1.second)
action()
我正在尝试创建 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
从不执行。
您的 apply
将 timers
注入 Consumer
。在 idle
中,您启动了计时器,然后调用 action
来构造一个新的 Behavior
,但是您随后将其丢弃并实际使用了您的演员具有的 same
行为(不会回复任何消息)。
idle
可能应该按照这些行定义(我也在使用持续时间 DSL:import scala.concurrent.duration._
)
timers.startTimerWithFixedDelay(TimerKey, Timeout, 1.second)
action()