首页 > 解决方案 > Scala - 最终超时和 Thread.sleep() 之间的区别

问题描述

我有一些需要测试的异步(ZIO)代码。如果我使用Thread.sleep()它创建一个测试部分工作正常,我总是得到响应:

for {
 saved <- database.save(smth)
 result <- eventually {
   Thread.sleep(20000)
   database.search(...) 
 }
} yield result

但是,如果我使用timeoutinterval从那时起使用相同的逻辑,eventually它就永远无法正常工作(我有超时):

for {
   saved <- database.save(smth)
   result <- eventually(timeout(Span(20, Seconds)), interval(Span(20, Seconds))) {
     database.search(...) 
   }
} yield result

我不明白为什么timeoutinterval工作方式不同Thread.sleep。它应该做完全相同的事情。有人可以向我解释一下并告诉我应该如何将这段代码更改为不需要使用Thread.sleep()吗?

标签: scalascalatestzio

解决方案


假设database.search(...)返回ZIO[]对象。

eventually{database.search(...)}很可能在第一次尝试后立即成功。

它成功创建了一个查询数据库的任务。然后在没有任何重试逻辑的情况下查询数据库。

关于如何使其工作:

val search: ZIO[Any, Throwable, String] = ???
val retried: ZIO[Any with Clock, Throwable, Option[String]] = search.retry(Schedule.spaced(Duration.fromMillis(1000))).timeout(Duration.fromMillis(20000))

像这样的东西应该工作。但我相信存在更优雅的解决方案。


推荐阅读