Я использую 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
секунд также приветствуется.