我正在使用ZIO,我的任务是用这样的逻辑(简化)重试对某些服务的请求:
1.如果响应包含一些不正确的数据-重试N次,如果情况没有改变-保留结果
1.如果响应包含的数据不足-重试M次,如果情况未发生变化-保留结果
我计划使用ZIO的.repeat函数,但不知道如何编写将为每个条件单独计算重试次数的计划。
package com.mycompany
import zio.Schedule.WithState
import zio.{ExitCode, Schedule, Task, URIO, ZIO, ZIOAppDefault}
import scala.util.Random
object Main3 extends ZIOAppDefault {
def makeRequest: Task[Float] = ZIO.attempt {
new Random().nextFloat() * 10
}
def makeSchedule(): WithState[(Unit, Unit), Any, Float, Float] = {
val firstCondition =
Schedule.recurUntil[Float](float => float > 3)
// TODO: make only 3 tries for this condition
.onDecision {
case (input, value, decision) => ZIO.log(s"FirstCondition: ${input}, ${value}, ${decision}")
}
val secondCondition =
Schedule.recurUntil[Float](float => float < 9)
// TODO: make only 5 tries for this condition
.onDecision {
case (input, value, decision) => ZIO.log(s"SecondCondition: ${input}, ${value}, ${decision}")
}
firstCondition.||(secondCondition).map(_._1)
}
override def run: URIO[Any, ExitCode] = {
makeRequest
.repeat(makeSchedule())
.tap(res => ZIO.log(f"RESULT IS: $res"))
.exitCode
}
}
字符串
1条答案
按热度按时间6ovsh4lw1#
我找到了解决办法:
字符串
调用passthrough[Float]允许对齐类型并从repeat中获取结果。最后的代码片段是
型