scala - 如何多次重复等待?
问题描述
我是 Scala 的新手。我只想在code1
超时时重试。如果出现另一个错误,我会以另一种方式处理。如果超时,我想再试一次,比如3次。这样做的正确方法是什么?
我不确定code2
在 Scala 上使用类似的东西是否是最好的方法。也许已经有更好的东西了。有没有更干净的破解方法?我应该使用 Await.ready 而不是结果吗?
我也不确定是否应该使用 Await.ready 或 Await.result。
代码1:
Await.result(myMethod(), Duration(120, "seconds"))
代码2:
breakable {
for(_ <- 0 to 3) {
Try(Await.result(myMethod(), Duration(120, "seconds"))) match {
case Success(value) => {
// do something
break()
}
case Failure(_) => // how can I now if it is timeout?
}
}
}
解决方案
等待 aFuture
使整个Future
事情变得毫无意义。话虽如此,有3种情况应该处理:
- 所有尝试都超时
- 非超时失败
- a
Future
成功完成
import scala.concurrent.duration._
import scala.concurrent.{Future, Await, TimeoutException}
import scala.util.{Try, Success, Failure}
// v--max number of attempts
LazyList.fill(4)(Try(Await.result(myMethod(), 120.seconds)))
.dropWhile{case Failure(_:TimeoutException) => true
case _ => false
}.headOption.fold{
//every attempt timed out
}{
case Success(value) => //do something
case Failure(ex:Throwable) => //ex is non-timeout exception
}
注意:LazyList
是 Scala 2.13.x 集合。列表中的每个元素仅在需要时才评估,因此如果第一个成功,则不会启动其他期货。
推荐阅读
- android - 如何在多模块项目中配置 Flutter 模块
- android - 无法在 Google Play 商店上发布 Xamarin.Forms 应用程序的 APK 文件
- java - 足球比赛调度算法
- node.js - Kubernetes Nginx Ingress 和 Socket.io 连接问题
- python - 如何在 Raspbian Buster 上使用无头 Firefox 设置 Selenium
- powershell - 从 ipconfig 中获取未知 IP,并使用 BATCH 脚本使用该 IP 编辑未知 .ini 行
- php - 限制包含 10 个以上相关帖子的标签的 Wordpress 标签页面
- java - 如何在 Java 中操作数组?
- airflow-scheduler - 手动运行的气流时间增量传感器行为
- laravel - 如何根据辅助函数的返回值在 laravel 查询中创建条件