期货未终止的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主类的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序未运行(终止/终止)时,如何保持核心位置和核心蓝牙运行?