Akka scheduleOnce回调从未触发问题求助
排查Akka Scheduler scheduleOnce无输出的问题
我来帮你梳理下这个问题的常见原因和解决办法,你遇到的情况大概率是下面几个点之一:
程序在调度任务执行前就提前退出了
Akka的调度器是异步执行任务的,如果你的主线程在调度任务还没触发的时候就结束了,整个JVM进程会直接退出,任务自然不会执行。比如你的代码只是创建了ActorSystem、调度任务,之后没有任何等待逻辑,主线程跑完就结束了。解决办法很简单,要么让程序等待任务执行完成,要么在任务执行后主动终止ActorSystem并等待其关闭:
import akka.actor.ActorSystem import scala.concurrent.duration._ import scala.concurrent.Await def main(args: Array[String]): Unit = { implicit val system: ActorSystem = ActorSystem("system-test1") // 必须导入ActorSystem的dispatcher作为ExecutionContext import system.dispatcher // 调度任务,执行完后终止系统 system.scheduler.scheduleOnce(2 seconds)(() => { println("Hi") system.terminate() }) // 等待系统完全终止,避免程序提前退出 Await.result(system.whenTerminated, Duration.Inf) }缺少必要的ExecutionContext隐式值
scheduleOnce方法需要一个隐式的ExecutionContext来执行回调任务。如果你的代码里没有导入system.dispatcher,虽然有些环境(比如Scala REPL)可能有默认的ExecutionContext,但在独立应用中这会导致任务无法正确被调度,甚至编译报错。所以一定要确保在调度代码前加上:import system.dispatcher断点调试的小坑
如果程序提前退出,你的断点当然不会触发。先解决上面的程序退出问题,再调试断点。另外,如果是在IDE中调试,确保你已经正确配置了Akka的运行环境,没有因为类加载问题导致断点失效。依赖版本不兼容
如果你使用的Akka版本过旧或者依赖缺失,也可能导致调度器无法正常工作。比如在sbt中要确保引入了正确的Akka Actor依赖:libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.8.5" // 替换为你使用的版本
先试试上面的前两个办法,这是最常见的原因,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者vicaba
相关产品推荐
相关产品推荐

