使用Scala,当第一次调用失败时重试,直到我们收到成功响应或达到最大时间限制



使用Scala,当第一次调用失败时重试,直到我们收到成功响应或达到最大时间限制(比如执行第一次调用所需的{2500-quot;时间"}ms(。

我尝试使用atmos库,但没有找到在达到最大时间限制后终止调用的选项。

import scala.concurrent.duration._
import atmos.dsl._
implicit val retryPolicy = retryForever using constantBackoff { 0 millis }

在上述重试策略中,我们不能限制停止重试过程的最长时间限制。请帮忙。实现该功能的任何其他方法也是值得赞赏的。

您不需要库。

def keepTrying[T](until: Deadline)(what: => T): Try[T] = Try {
what
} recoverWith {
case _ if until.hasTimeLeft => keepTrying(until)(what)
}

请注意,您可能需要某种回退策略,以防它一直快速失败,因为它会(1(固定CPU,(2(填满堆栈空间。

您可以通过将其转换为tailrec:来避免后者

@tailrec
def keepTrying[T](until: Deadline)(what: => T): T = try {
what
catch { case _ if until.hasTimeLeft => 
keepTrying(until)(what)
}

但是,如果您的操作持续快速失败,这仍然会使cpu大量旋转。在重试之前使用类似Thread.sleep(100)的方法可能是明智的。

最新更新