我想在我的处理程序中监听grpc中优雅的服务器终止。当服务器正常停止时,我想在我的代码中添加一些逻辑来关闭打开的端口,文件,刷新结果等。我该怎么做?
在一元和流处理程序的情况下,它有何不同?
答案 0 :(得分:0)
你可以通过听这样的信号来关闭钩子
在您的主要功能或启动服务器的位置为您想要收听的信号创建频道
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
// call your cleanup method with this channel as a routine
go cleanup(c)
在你的清理方法
func cleanup(c chan os.Signal) {
// Wait for termination
<- c
// Do your cleanups here
}
在启动gRPC服务器之前,创建信号通道并将cleanup
函数作为go例程调用。每当应用程序(gRPC服务器)停止或中断时,此通道将在cleanup
函数中获取信号,您可以在其中进行必要的清理
答案 1 :(得分:0)
目前没有机制向服务处理程序发出关于Graceful stop的信号。在服务器退出时必须发生的清理和其他此类全局功能通常不会发生在服务处理程序内部。 也就是说,如果你认为你的设计在服务处理程序内部发生这种清理会更好,并且来自优雅关闭的信号是至关重要的,我们希望能够更多地了解您的用例。也许在我们的github repo上打开一个问题,我们可以在那里讨论它。
最佳,
麦
答案 2 :(得分:0)
对于grpc服务器,您可以这样做
func waitForGracefulShutdown(srv *grpc.Server) {
fmt.Println("Grpc messaging server started ...")
interruptChan := make(chan os.Signal, 1)
signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
// Block until we receive our signal.
<-interruptChan
// Create a deadline to wait for.
_, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
srv.GracefulStop()
publisher, messagingError := messaging.GetPublisherInstance()
if messagingError.Error == nil {
publisher.Close()
}
log.Println("Shutting down grpc messaging server.")
os.Exit(0)
}