4138fe02 by astaxie

beego suppot graceful restart application

1 parent 245762f7
...@@ -19,9 +19,11 @@ import ( ...@@ -19,9 +19,11 @@ import (
19 "encoding/json" 19 "encoding/json"
20 "fmt" 20 "fmt"
21 "net/http" 21 "net/http"
22 "os"
22 "text/template" 23 "text/template"
23 "time" 24 "time"
24 25
26 "github.com/astaxie/beego/grace"
25 "github.com/astaxie/beego/toolbox" 27 "github.com/astaxie/beego/toolbox"
26 "github.com/astaxie/beego/utils" 28 "github.com/astaxie/beego/utils"
27 ) 29 )
...@@ -458,8 +460,14 @@ func (admin *adminApp) Run() { ...@@ -458,8 +460,14 @@ func (admin *adminApp) Run() {
458 http.Handle(p, f) 460 http.Handle(p, f)
459 } 461 }
460 BeeLogger.Info("Admin server Running on %s", addr) 462 BeeLogger.Info("Admin server Running on %s", addr)
461 err := http.ListenAndServe(addr, nil) 463
464 var err error
465 if Graceful {
466 err = grace.ListenAndServe(addr, nil)
467 } else {
468 err = http.ListenAndServe(addr, nil)
469 }
462 if err != nil { 470 if err != nil {
463 BeeLogger.Critical("Admin ListenAndServe: ", err) 471 BeeLogger.Critical("Admin ListenAndServe: ", err, fmt.Sprint(os.Getpid()))
464 } 472 }
465 } 473 }
......
...@@ -22,6 +22,7 @@ import ( ...@@ -22,6 +22,7 @@ import (
22 "os" 22 "os"
23 "time" 23 "time"
24 24
25 "github.com/astaxie/beego/grace"
25 "github.com/astaxie/beego/utils" 26 "github.com/astaxie/beego/utils"
26 ) 27 )
27 28
...@@ -76,6 +77,41 @@ func (app *App) Run() { ...@@ -76,6 +77,41 @@ func (app *App) Run() {
76 err = fcgi.Serve(l, app.Handlers) 77 err = fcgi.Serve(l, app.Handlers)
77 } 78 }
78 } else { 79 } else {
80 if Graceful {
81 if EnableHttpTLS {
82 go func() {
83 time.Sleep(20 * time.Microsecond)
84 if HttpsPort != 0 {
85 addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort)
86 }
87 server := grace.NewServer(addr, app.Handlers)
88 server.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second
89 server.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second
90 err := server.ListenAndServeTLS(HttpCertFile, HttpKeyFile)
91 if err != nil {
92 BeeLogger.Critical("ListenAndServeTLS: ", err)
93 time.Sleep(100 * time.Microsecond)
94 endRunning <- true
95 }
96 }()
97 }
98 if EnableHttpListen {
99 go func() {
100 server := grace.NewServer(addr, app.Handlers)
101 server.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second
102 server.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second
103 if ListenTCP4 && HttpAddr == "" {
104 server.Network = "tcp4"
105 }
106 err := server.ListenAndServe()
107 if err != nil {
108 BeeLogger.Critical("ListenAndServe: ", err, fmt.Sprint(os.Getpid()))
109 time.Sleep(100 * time.Microsecond)
110 endRunning <- true
111 }
112 }()
113 }
114 } else {
79 app.Server.Addr = addr 115 app.Server.Addr = addr
80 app.Server.Handler = app.Handlers 116 app.Server.Handler = app.Handlers
81 app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second 117 app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second
...@@ -128,5 +164,6 @@ func (app *App) Run() { ...@@ -128,5 +164,6 @@ func (app *App) Run() {
128 } 164 }
129 } 165 }
130 166
167 }
131 <-endRunning 168 <-endRunning
132 } 169 }
......
...@@ -82,6 +82,7 @@ var ( ...@@ -82,6 +82,7 @@ var (
82 EnableDocs bool // enable generate docs & server docs API Swagger 82 EnableDocs bool // enable generate docs & server docs API Swagger
83 RouterCaseSensitive bool // router case sensitive default is true 83 RouterCaseSensitive bool // router case sensitive default is true
84 AccessLogs bool // print access logs, default is false 84 AccessLogs bool // print access logs, default is false
85 Graceful bool // use graceful start the server
85 ) 86 )
86 87
87 type beegoAppConfig struct { 88 type beegoAppConfig struct {
...@@ -509,5 +510,8 @@ func ParseConfig() (err error) { ...@@ -509,5 +510,8 @@ func ParseConfig() (err error) {
509 if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil { 510 if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil {
510 RouterCaseSensitive = casesensitive 511 RouterCaseSensitive = casesensitive
511 } 512 }
513 if graceful, err := AppConfig.Bool("Graceful"); err == nil {
514 Graceful = graceful
515 }
512 return nil 516 return nil
513 } 517 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!