如何以编程方式关闭fs2.StreamApp?

时间:2018-03-06 21:59:22

标签: scala http4s fs2

扩展StreamApp会要求您提供stream def。它有一个requestShutdown参数。

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

我为此提供了实现,并了解args作为命令行参数传入。但是,我不确定是什么提供requestShutdown参数以及我可以用它做什么。

具体来说,我想在正在启动Http4s服务器(永远阻塞)的Stream[IO, ExitCode]上调用正常关闭。

看起来需要Signal并且必须设置?我试图进入的基础流程是'看起来像这样:

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

来自fs2项目的stream def hereStreamAppSpecStreamAppSpec中有一些内容,但我无法理解我是怎样的适应它。

1 个答案:

答案 0 :(得分:3)

您可以将提供给流功能的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服务器。

然后我们加入这两个流,以便它们同时运行,这意味着Web服务器将运行10秒,然后另一个流表明程序应该终止。