扩展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 here和StreamAppSpec
在StreamAppSpec
中有一些内容,但我无法理解我是怎样的适应它。
答案 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秒,然后另一个流表明程序应该终止。