akka Scala -对未来的组件重试(SoftwareMill重试)

esbemjvw  于 2023-08-05  发布在  Scala
关注(0)|答案(1)|浏览(173)

我有一些代码,试图在for comp中执行一系列future,并返回完成comp的值。我想在整个for comp上实现一个重试函数,而不是在每个嵌套的future上实现一个单独的重试。我正在尝试使用SoftwareMill's Retry
示例代码:

implicit val successDeterminer: Success[Either[Error, Option[FinalResponse]]] =
    Success[Either[Error, Option[FinalResponse]]](
      test => test.isRight
    )

    def processExample(var1: Variable1, var2: Variable2): Future[Either[Error, SuccessfulResponse]] = {
    val result = for {
      resp1 <- function1(var1) //returns EitherT[Future, Error, Response1]
      resp2 <- function2(var2) // returns EitherT[Future, Error, Response2]
      doesSomething = function3(resp2) // returns boolean
      finalResult <- function4(doesSomething) // returns EitherT[Future, Error, Option[FinalResponse]
    } yield finalResult

    val retryResult = policy.apply(() => result.value)(
      success = successDeterminer,
      executor = executionContext
    )
    handleRetriedResult(retryResult) // returns Future[Either[Error, Option[SuccessfulResponse]]
  }

字符串
所以这个运行了,但是我有一个单元测试,它强制function2返回一个Left响应。因此,根据我的策略,我希望这次重试执行3次。但是,它只执行一次对function2的调用。
是否可以将重试放在整个for comp上,并让它重试整个操作流?如果我想让他们都重试,我需要把它放在我拥有的每个未来上吗?

disbfnqx

disbfnqx1#

总是这样只要我发布一个问题,它就会点击。所以问题是for comp被定义为函数调用内部的变量。因此,当重试发生时,它会重试已经执行for comp并因此具有值的变量。它不需要回忆里面的未来。
通过将我的for comp代码移动到它自己的函数中,然后让retry调用该函数,当它重试时,它会创建一个全新的my for comp future调用,因此执行我想要的次数。

相关问题