我正在使用 http4s BlazeServer 0.21,如何优雅关机?我想在硬关机时间内拒绝所有即将到来的请求,并保持处理未完成的请求和响应。
我尝试使用启动服务器serveWhile
并设置一个 shutdownHook SignallingRef
。服务器流和中间件按预期延迟(因此我们的指标和日志中间件仍然记录此响应)
//serverStream
for {
signal <- fs2.Stream.eval(SignallingRef[F, Boolean](false))
exitCode <- fs2.Stream.eval(Ref[F].of(ExitCode.Success))
_ <- fs2.Stream.eval(shutdown(signal))
server <- BlazeServerBuilder[F]
.bindHttp(8080, "0.0.0.0")
.withHttpApp(httpApp)
.serveWhile(signal, exitCode)
} yield server
def shutdown[F[_]: Effect](interrupter: SignallingRef[F, Boolean]): F[Unit] = {
LiftIO[F].liftIO(IO {
sys.addShutdownHook {
...
interrupter.set(true)
}
})
}
object Server extends IOApp {
def run(args: List[String]): IO[ExitCode] =
serverStream[IO].compile.drain.as(ExitCode.Success)
}
但是http服务器没有像我预期的那样工作,好像http4s的内部ServerChannel
有它自己的shutdownHook并且已经取消了所有的响应。
任何建议/解决方法?或者也许只是一种保持和不杀死请求x
几秒钟的方法,也值得赞赏。