server/cmd/api/main.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package main import ( "context" "fmt" "log" "net/http" "os/signal" "syscall" "time" "server/internal/server" ) func gracefulShutdown(apiServer *http.Server, done chan bool) { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() <-ctx.Done() log.Println("shutting down gracefully, press Ctrl+C again to force") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := apiServer.Shutdown(ctx); err != nil { log.Printf("Server forced to shutdown with error: %v", err) } log.Println("Server exiting") done <- true } func main() { server := server.NewServer() done := make(chan bool, 1) go gracefulShutdown(server, done) err := server.ListenAndServe() if err != nil && err != http.ErrServerClosed { panic(fmt.Sprintf("http server error: %s", err)) } <-done log.Println("Graceful shutdown complete.") } |