我有一些代码,试图在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上,并让它重试整个操作流?如果我想让他们都重试,我需要把它放在我拥有的每个未来上吗?
1条答案
按热度按时间disbfnqx1#
总是这样只要我发布一个问题,它就会点击。所以问题是for comp被定义为函数调用内部的变量。因此,当重试发生时,它会重试已经执行for comp并因此具有值的变量。它不需要回忆里面的未来。
通过将我的for comp代码移动到它自己的函数中,然后让retry调用该函数,当它重试时,它会创建一个全新的my for comp future调用,因此执行我想要的次数。