gpt4 book ai didi

scala - ScalaTest 中的 afterAll() 在未来使用时出现的问题

转载 作者:行者123 更新时间:2023-12-03 09:09:27 24 4
gpt4 key购买 nike

在我的 ScalaTest 套件结束时,我需要进行一些数据库清理。清理本身就是一个Future。该套件不会调用 super.afterAll(),这会使套件使用的一些资源(例如 Web 浏览器和数据库连接)处于挂起状态。

以下是相关代码片段:

override def afterAll():Unit={
var cleanUpsInProgress = true
DB.cleanUpDeletedSegments(db).onComplete{case _ =>
cleanUpsInProgress = false
}
while(cleanUpsInProgress){}
db.close()
aggregatesDB.close()
super.afterAll()
}

def cleanUpDeletedSegments(implicit db:ADMPDB):Future[Int]={
db.run{
segments.filter(_.deleted === 1).delete
}
}

我调试了一段时间,摸不着头脑,得出的结论是,它甚至没有在未来的 onComplete 回调中处理代码。即使我用 stub Future.successfull(1) 替换 Slick 的 db 操作,我仍然有一切待处理,并且 super.afterAll() 不会被调用。也许我正在做一些愚蠢的错误事情?你能帮忙吗?

注意:另外,我确实认为我需要在这里使用这个丑陋的 varwhile 循环,因为否则主线程就会完成,并且启动套件运行的框架只是关闭 JVM。也许我在这里错了,所以很高兴听到一些评论。

--------------------------更新-------------------- --

泰勒的解决方案有效。但是当我 flatMap 进行一次异步清理(我实际上需要这样做)时,问题又是一样的。下面的代码卡住并且不调用 super.afterAll:

override def afterAll():Unit={
val cleanUp = DB.cleanUpDeletedSegments(db).flatMap(_ => DB.cleanUpDeletedSegmentGroups(db))
Await.result(cleanUp, 6 seconds)
db.close()
aggregatesDB.close()
super.afterAll()
}

Await.result 也不会抛出 TimeoutException,据我所知,两者都没有正常完成。有什么想法吗?

只有当我为每个 future 依次使用 Await.result 时,它才有效,如下所示:

override def afterAll():Unit={
val cleanUpSegments = DB.cleanUpDeletedSegments(db)
Await.result(cleanUpSegments, 3 seconds)
val cleanUpSegmentGroups = DB.cleanUpDeletedSegmentGroups(db)
Await.result(cleanUpSegmentGroups, 3 seconds)
db.close()
aggregatesDB.close()
super.afterAll()
}

最佳答案

等待您的 future 清理完成可能会更容易:

import scala.concurrent.Await
import scala.concurrent.duration._

override def afterAll() ={
val future = DB.cleanUpDeletedSegments(db)
Await.result(future, 2 minutes)
aggregatesDB.close()
super.afterAll()
}

您可以将超时设置为合理的值

关于scala - ScalaTest 中的 afterAll() 在未来使用时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com