【问题标题】:Scala main class with futures not terminating期货未终止的Scala主类
【发布时间】: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相反的。你不应该需要它,你这样做的原因实际上可能与光滑有关:)

标签: scala future slick actor actorsystem


【解决方案1】:

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

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

我用过

fork in run := true

这很好用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多