好的,好的.
我有一个可以工作的微服务,它通过Tokio/Quonent提供GRPC,并通过WARP公开指标.当接收到SIGINT信号时,http和GRPC服务都会正确关闭,即通过终端终止.
满分code on Github,相关代码如下:
// Sigint signal handler that closes the DB connection upon shutdown
let signal = grpc_sigint(dbm.clone());
// Construct health service for gRPC server
let (mut health_reporter, health_svc) = tonic_health::server::health_reporter();
health_reporter.set_serving::<JobRunnerServer<MyJobRunner>>().await;
// Build gRPC server with health service and signal sigint handler
let grpc_server = TonicServer::builder()
.add_service(grpc_svc)
.add_service(health_svc)
.serve_with_shutdown(grpc_addr, signal);
Sigint处理程序相当基本,但可以完成工作.
async fn grpc_sigint(dbm: DBManager) {
let _ = signal(SignalKind::terminate())
.expect("failed to create a new SIGINT signal handler for gRPC")
.recv()
.await;
// Shutdown the DB connection.
dbm.close_db().await.expect("Failed to close database connection");
println!("gRPC shutdown complete");
}
这可以很好地工作,但该服务不会捕获ctrl-c,也不会响应其他信号,例如sig-Quit,因为它只有一个用于sigint的信号处理程序.因为该服务应该在多个平台上运行,所以没有给出sig-int是唯一要处理的信号.
我做了一些在线搜索,但不知何故,大多数例子都与我正在使用的相似,所以我不太清楚如何处理Tokio中的多个信号,以便在任何信号触发时触发正常关机.
因此,我的问题是,如何修改信号处理程序,使其捕获多个关闭信号,如Sigint、Ctrr-c或sig-Quit?
先谢谢你了.