Closed
Description
With the removal of hyper::Server
, the graceful shutdown stuff would disappear. We want to continue to provide a helper to do that, in hyper-util, but make it also able to be used with timeouts. Perhaps something like this:
let listener = TcpListener::bind("0.0.0.0:0").await?;
let server = Server::new();
let graceful = GracefulShutdown::new();
let ctrl_c = tokio::signal::ctrl_c();
loop {
tokio::select! {
conn = listener.accept() => {
let server = server.clone();
let graceful = graceful.clone();
task::spawn(async move {
// maybe TLS accept here...
let conn = server.serve_connection(conn);
let conn = graceful.watch(conn);
if let Err(e) = conn.await {
eprintln!("http server conn error: {}", e);
}
});
},
_ = ctrl_c => {
eprintln!("Ctrl-C received, starting shutdown");
break;
}
}
}
tokio::select! {
_ = graceful.shutdown() => {
eprintln!("Gracefully shutdown!");
},
_ = tokio::time::sleep(10.seconds()) => {
eprintln!("Waited 10 seconds for graceful shutdown, aborting...");
}
}