Начальная задержка для ZIO ZSchedule
График, который я пытаюсь составить, должен:
- Начать после указанной задержки
- Повторяйте с фиксированной скоростью
- Завершить, если он достигнет заданного срока или встретит состояние завершения
Итак, у меня есть (2.) и (3.):
val repeatUntilTimeLimitReached =
ZSchedule
.fixed(config.pollingConfig.pollInterval)
.untilOutput(pollingTimeLimitReached)
val untilTermination = Schedule.doUntil[RebootState](_.terminatesPolling)
val schedule = repeatUntilTimeLimitReached *> untilTermination
Я попытался ZSchedule.delayed()
, но, похоже, это добавляет задержки и в последующие расписания.
Так есть ли способ добавить начальную задержку к ZSchedule
?
2 ответа
Решение
После небольшого обсуждения с сообществом выяснилось, что ожидаемое поведение недостижимо с Schedule
(Версия ZIO: 1.0.0-RC15), поскольку используется для повторения после первого выполнения.
В итоге я использовал ZIO.sleep()
а также schedule
Я сделал в оригинальном посте:
val schedule = repeatUntilTimeLimitReached *> untilTermination
for {
_ <- ZIO.sleep(initialDelay)
state <- doStuff().repeat(schedule)
} yield state
Почему бы не добавить еще одно расписание и не составить их:
val delayedSchedule = Schedule.once.delayed(_ + 12.seconds)
val schedule = delayedSchedule *> repeatUntilTimeLimitReached *> untilTermination
Я немного поиграл с этим, и вам нужно flatMap
в расписании.
Здесь я использую пример, в котором используется zio.console
:
import zio.console._
import zio.duration._
import zio.{App, Schedule, ZIO}
val s = Schedule.spaced(1.second)
for {
_ <- putStrLn("Start")
_ <- putStrLn("Initial Delay").delay(5.seconds)
_ <- putStrLn("Repeated Delay").repeat(s)
} yield ()