Как программно закрыть 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 секунд, прежде чем другой поток подаст сигнал о прекращении работы программы.