graceful_shutdown/
graceful_shutdown.rs1use axum::{routing::get, Router};
11use axum_server::Handle;
12use std::{net::SocketAddr, time::Duration};
13use tokio::time::sleep;
14
15#[tokio::main]
16async fn main() {
17 let app = Router::new().route("/", get(|| async { "Hello, world!" }));
18
19 let handle = Handle::new();
20
21 tokio::spawn(graceful_shutdown(handle.clone()));
23
24 let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
25 println!("listening on {}", addr);
26 axum_server::bind(addr)
27 .handle(handle)
28 .serve(app.into_make_service())
29 .await
30 .unwrap();
31
32 println!("server is shut down");
33}
34
35async fn graceful_shutdown(handle: Handle) {
36 sleep(Duration::from_secs(10)).await;
38
39 println!("sending graceful shutdown signal");
40
41 handle.graceful_shutdown(Some(Duration::from_secs(30)));
43
44 loop {
46 sleep(Duration::from_secs(1)).await;
47
48 println!("alive connections: {}", handle.connection_count());
49 }
50}