我正试图在我的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中,默认的ExecutionContext
是system
对象中的dispatcher
对象:
implicit val executionContext: ExecutionContext = ctx.system.dispatcher
我把它放在一个基类中,用于所有Actor,以及Timeout
和ActorMaterializer
的默认隐式。
您可以只使用Behaviors.withTimers
,也可以同时使用Behaviors.setup
和Behaviors.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
}
}
}