【发布时间】:2020-05-25 23:14:28
【问题描述】:
我使用的是 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 秒请求的方法。
【问题讨论】: