在akka类型的actor内部创建调度程序/计时器



我正试图在我的akka类型中创建一个调度程序,只是为了测试它,比如每x秒运行一次。

def start(): Behavior[ClientMsg] = Behaviors.setup { ctx =>
ctx.log.info("start() called")
ctx.system.scheduler.scheduleAtFixedRate(30.seconds, 5000.millis) { () =>
ctx.self ! TestMessage(""""this is pretty cool"""")
}  
}

我收到一个错误,说隐式执行上下文不在作用域中。

当在类型化的actor内部时,我应该从哪里获取执行上下文?此外,这就是我应该如何设置调度程序/计时器吗?

请注意,与直接使用系统调度程序相比,使用Behaviors.withTimers { timers => ... }应该更可取,因为它可以在参与者停止等情况下处理删除已调度的发送。

在非类型Akka中,默认的ExecutionContextsystem对象中的dispatcher对象:

implicit val executionContext: ExecutionContext = ctx.system.dispatcher

我把它放在一个基类中,用于所有Actor,以及TimeoutActorMaterializer的默认隐式。

您可以只使用Behaviors.withTimers,也可以同时使用Behaviors.setupBehaviors.withTimers:

https://doc.akka.io/docs/akka/2.7.0/typed/actor-lifecycle.html

object HelloWorldMain {
final case class SayHello(name: String)
def apply(): Behavior[SayHello] =
Behaviors.setup { context =>
val greeter = context.spawn(HelloWorld(), "greeter")
Behaviors.receiveMessage { message =>
val replyTo = context.spawn(HelloWorldBot(max = 3), message.name)
greeter ! HelloWorld.Greet(message.name, replyTo)
Behaviors.same
}
}
}

相关内容

  • 没有找到相关文章