我将在一个长轮询过程中组合ZIO重试和重复:logic.repeat(repeatSchedule).retry(retrySchedule)
其中逻辑是一个可能失败的ZIO。
由于retrySchedule
可以是指数后退,它可以在出现错误时无限增长,然而,我想在逻辑成功后将其重置为初始值(将无限重复(
我正在关注ZIO Scheduling文档中关于CCD_ 3组成的部分,但我错过了一个";递归的";组合,其中类似以下内容是可能的:
Schedule.exponential(baseDelay)
.whileOutput(_ < UpdaterManagerSettings.maxDelay)
.andThen([SOMETHING TO POINT RECURSIVELY AT THE SAME])
我认为这样的东西可能对你有用:
val logic = ZIO(???)
// First, create an effect that uses exponential backoff to retry logic.
// This effect will complete as soon as logic succeeds,
// or maximum number of retries is exceeded.
val retrySchedule = Schedule.exponential(baseDelay) && Schedule.recurs(maxRetries)
val retriedLogic = logic.retry(retrySchedule)
// Then, repeat the whole retriedLogic infinitely.
val repeatSchedule = Schedule.spaced(1.second)
val wholeProcedure = retriedLogic.repeat(repeatSchedule)
只要逻辑失败,就会以指数退避的方式重试。但一旦成功,它就会以固定的间隔重复。如果再次失败,则从baseDelay
再次开始指数回退。
请在此处查看运行示例:https://scastie.scala-lang.org/yZpBO34NRgK6BgYYIzk5Iw