问题描述
我结合 ZIO 重试并在长轮询过程中重复:
logic.repeat(repeatSchedule).retry(retrySchedule)
其中逻辑是一个可能失败的 ZIO。
由于 retrySchedule
可以指数退避,它可以在出错时无限增长,但是,我想在逻辑成功后将其重置为初始值(将无限重复)
我正在关注 ZIO Scheduling doc 中关于 Schedule
组合的部分,但我错过了“递归”组合,其中可能出现以下情况:
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