期货未终止的Scala主类

Posted

技术标签:

【中文标题】期货未终止的Scala主类【英文标题】:Scala main class with futures not terminating 【发布时间】:2021-09-12 13:35:36 【问题描述】:

我有一个 scala 主类

object Job extends App 

         def myProcedure() = 
             sqlu"""CALL `dbName`.`update_history();"""
         

         implicit val system: ActorSystem = ActorSystem()
         implicit val mat: ActorMaterializer = ActorMaterializer()
         implicit val ec = system.dispatcher
         implicit val session: SlickSession = SlickSession.forConfig("my-mysql")
         val proc = session.db.run(myProcedure))
          
         val terminatedF = proc.flatMap  rec =>
              println("value of the procedure ::" + rec)
              session.close()
              system.terminate()
         
         Await.result(terminatedF, Duration.Inf)
          println("terminated :::")
     

我看到rec 的值被打印出来,terminated ::: 也被打印出来,即最后一行也被打印出来。然而程序并没有结束。我这里有什么遗漏吗?

【问题讨论】:

您可能需要以某种方式“关闭”或“终止”该会话。我不知道 slick,但是这个 sn-p 看起来不像是写给我的,让 session 像这样坐在那里。这不是访问外部资源的代码通常看起来的样子。对于您的问题,它内部可能有一个线程池,可以防止您的程序退出。尝试筛选光滑的文档,专门寻找会话管理。 感谢您的回复,但我发现了问题所在。它与 slick 无关,但与使 JVM 优雅退出有关 如果“优雅地退出”,System.exit相反的。你不应该需要它,你这样做的原因实际上可能与光滑有关:) 【参考方案1】:

这是用户定义线程的问题。

我在最后一个 Future 上使用了Await.result,然后又使用了sys.exit(0)。 也在build.sbt

我用过

fork in run := true

这很好用

【讨论】:

以上是关于期货未终止的Scala主类的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序未运行(终止/终止)时,如何保持核心位置和核心蓝牙运行?

休眠程序未终止

AWS lambda函数未终止线程

Swift:以 NSException 类型的未捕获异常终止

我得到美元符号未终止

Xcode 游乐场错误“未终止的 '/*' 注释”