Начальная задержка для ZIO ZSchedule

График, который я пытаюсь составить, должен:

  1. Начать после указанной задержки
  2. Повторяйте с фиксированной скоростью
  3. Завершить, если он достигнет заданного срока или встретит состояние завершения

Итак, у меня есть (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 ()
Другие вопросы по тегам