Как программно закрыть fs2.StreamApp?

Простирающийся StreamApp просит вас предоставить stream отсроченный Оно имеет requestShutdown параметр.

def stream(args: List[String], requestShutdown: F[Unit]): Stream[F, ExitCode]

Я предоставляю реализацию для этого и понимаю, что args передается в качестве аргументов командной строки. Я не уверен, однако, что поставляет requestShutdown параметр и что я могу с ним сделать.

В частности, я хотел бы вызвать изящное отключение на Stream[IO, ExitCode] который запускает сервер Http4s (который блокирует навсегда).

Это выглядит как Signal нужен и должен быть установлен? Основной поток, на который я пытаюсь "попасть", выглядит так:

for {
   scheduler <- Scheduler[IO](corePoolSize = 1)
   exitCode  <- BlazeBuilder[IO]
                    .bindHttp(port, "0.0.0.0")
                    .mountService(services(scheduler), "/")
                    .serve
    } yield exitCode

мой stream Def здесь и StreamAppSpec из проекта FS2 есть что-то в StreamAppSpec но я не могу понять, как мне это адаптировать.

1 ответ

Вы можете думать о requestShutdown параметр, который передается в функцию потока как означающее действие, которое при выполнении будет запрашивать завершение программы.

Выполнение этого приведет к завершению программы.

Вот пример использования:

  override def stream(args: List[String], requestShutdown: IO[Unit]): Stream[IO, ExitCode] =
    for {
      scheduler <- Scheduler[IO](corePoolSize = 1)
      exitStream = scheduler.sleep[IO](10 seconds)
       .evalMap(_ => requestShutdown)
       .map(_ => ExitCode.Success)
      serverStream = BlazeBuilder[IO]
        .bindHttp(port, "0.0.0.0")
        .mountService(services(scheduler), "/")
        .serve
      result <- Stream.emits(List(exitStream, serverStream)).joinUnbounded
    } yield result

В этом сценарии мы создаем два потока:

  • Первый будет ждать в течение 10 секунд, прежде чем вызвать эффект
    Завершение приложения.

  • Второй запустит сервер http4s.

Затем мы объединяем эти два потока, чтобы они работали одновременно, что означает, что веб-сервер будет работать в течение 10 секунд, прежде чем другой поток подаст сигнал о прекращении работы программы.

Другие вопросы по тегам