1
0
mirror of https://github.com/actix/examples synced 2025-06-26 17:17:42 +02:00

enhanced, renamed shutdown example and modified async_pg readme

This commit is contained in:
dowwie
2020-01-31 07:10:56 -05:00
parent 78a753a06a
commit da72aef69c
7 changed files with 42 additions and 13 deletions

View File

@ -0,0 +1,13 @@
[package]
name = "shutdown-server"
version = "2.0.0"
authors = ["Rob Ede <robjtede@icloud.com>"]
edition = "2018"
description = "Send a request to the server to shut it down"
[dependencies]
actix-rt = "1.0.0"
actix-web = "2.0.0"
env_logger = "0.7"
futures = "0.3"
tokio = { version = "0.2.11", features = ["signal"] }

27
shutdown-server/README.md Normal file
View File

@ -0,0 +1,27 @@
# shutdown-server
Demonstrates how to shutdown the web server in a couple of ways:
1. remotely, via http request
- Created in response to actix/actix-web#1315
2. sending a SIGINT signal to the server (control-c)
## Usage
### Running The Server
```bash
cargo run --bin shutdown-server
# Starting 8 workers
# Starting "actix-web-service-127.0.0.1:8080" service on 127.0.0.1:8080
```
### Available Routes
- [GET /hello](http://localhost:8080/hello)
- Regular hello world route
- [POST /stop](http://localhost:8080/stop)
- Calling this will shutdown the server and exit

View File

@ -0,0 +1,66 @@
use std::{sync::mpsc, thread};
use actix_web::{get, middleware, post, web, App, HttpResponse, HttpServer};
use futures::executor;
use tokio::signal::unix::{signal, SignalKind};
#[get("/hello")]
async fn hello() -> &'static str {
"Hello world!"
}
#[post("/stop")]
async fn stop(stopper: web::Data<mpsc::Sender<()>>) -> HttpResponse {
// make request that sends message through the Sender
stopper.send(()).unwrap();
HttpResponse::NoContent().finish()
}
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
std::env::set_var("RUST_LOG", "actix_server=debug,actix_web=debug");
env_logger::init();
// create a channel
let (tx, rx) = mpsc::channel::<()>();
let stopper = tx.clone();
let bind = "127.0.0.1:8080";
// start server as normal but don't .await after .run() yet
let server = HttpServer::new(move || {
// give the server a Sender in .data
let stopper = tx.clone();
App::new()
.data(stopper)
.wrap(middleware::Logger::default())
.service(hello)
.service(stop)
})
.bind(&bind)?
.run();
// clone the Server handle
let srv = server.clone();
thread::spawn(move || {
// wait for shutdown signal
rx.recv().unwrap();
// stop server gracefully
executor::block_on(srv.stop(true))
});
let mut stream = signal(SignalKind::interrupt())?;
actix_rt::spawn(async move {
loop {
stream.recv().await;
println!("\n*** SIGINT received. Stopping server, gracefully. ***\n");
stopper.send(()).unwrap();
}
});
// run server
server.await
}