diff --git a/examples/graceful_shutdown/Cargo.toml b/examples/graceful_shutdown/Cargo.toml new file mode 100644 index 00000000..ddb9a4d2 --- /dev/null +++ b/examples/graceful_shutdown/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "example-graceful-shutdown" +version = "0.1.0" +edition = "2018" +publish = false + +[dependencies] +axum = { path = "../.." } +tokio = { version = "1.0", features = ["full"] } diff --git a/examples/graceful_shutdown/src/main.rs b/examples/graceful_shutdown/src/main.rs new file mode 100644 index 00000000..efdb7a15 --- /dev/null +++ b/examples/graceful_shutdown/src/main.rs @@ -0,0 +1,55 @@ +//! Run with +//! +//! ```not_rust +//! cargo run -p example-graceful-shutdown +//! kill or ctrl-c +//! ``` + +use axum::{handler::get, response::Html, Router}; +use std::net::SocketAddr; + +#[tokio::main] +async fn main() { + // build our application with a route + let app = Router::new().route("/", get(handler)); + + // run it + let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); + println!("listening on {}", addr); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .with_graceful_shutdown(shutdown_signal()) + .await + .unwrap(); +} + +async fn handler() -> Html<&'static str> { + Html("

Hello, World!

") +} + +#[cfg(unix)] +pub async fn shutdown_signal() { + use std::io; + use tokio::signal::unix::SignalKind; + + async fn terminate() -> io::Result<()> { + tokio::signal::unix::signal(SignalKind::terminate())? + .recv() + .await; + Ok(()) + } + + tokio::select! { + _ = terminate() => {}, + _ = tokio::signal::ctrl_c() => {}, + } + println!("signal received, starting graceful shutdown") +} + +#[cfg(windows)] +pub async fn shutdown_signal() { + tokio::signal::ctrl_c() + .await + .expect("faild to install CTRL+C handler"); + println!("signal received, starting graceful shutdown") +}