123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package http
- import (
- "context"
- "github.com/gin-gonic/gin"
- "log"
- "net/http"
- "os"
- "os/signal"
- "syscall"
- "time"
- )
- func Run(r *gin.Engine, addr string) {
- srv := &http.Server{
- Addr: addr,
- Handler: r,
- }
- // Initializing the server in a goroutine so that
- // it won't block the graceful shutdown handling below
- go func() {
- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- log.Fatalf("listen: %s\n", err)
- }
- }()
- // Wait for interrupt signal to gracefully shutdown the server with
- // a timeout of 5 seconds.
- quit := make(chan os.Signal, 1)
- // kill (no param) default send syscall.SIGTERM
- // kill -2 is syscall.SIGINT
- // kill -9 is syscall.SIGKILL but can't be catch, so don't need add it
- signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
- <-quit
- log.Println("Shutting down server...")
- // The context is used to inform the server it has 5 seconds to finish
- // the request it is currently handling
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- if err := srv.Shutdown(ctx); err != nil {
- log.Fatal("Server forced to shutdown: ", err)
- }
- log.Println("Server exiting")
- }
|