// Run beego application.
// 省略了不少代码,我们只关注 grace相关的 http
func (app *App) Run(mws ...MiddleWare) {
addr := BConfig.Listen.HTTPAddr
if BConfig.Listen.HTTPPort != 0 {
addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPAddr, BConfig.Listen.HTTPPort)
}
var (
err error
l net.Listener
endRunning = make(chan bool, 1)
)
// run cgi server
if BConfig.Listen.EnableFcgi {
}
app.Server.ReadTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
app.Server.WriteTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
app.Server.ErrorLog = logs.GetLogger("HTTP")
// run graceful mode
//
if BConfig.Listen.Graceful { // 在配置文件中开启grace 热重启
httpsAddr := BConfig.Listen.HTTPSAddr
app.Server.Addr = httpsAddr
if BConfig.Listen.EnableHTTP {
go func() {
server := grace.NewServer(addr, app.Handlers) // 调 grace 模块里面的server函数,初始化一些成员变量
server.Server.ReadTimeout = app.Server.ReadTimeout // 设置连接的读超时时间
server.Server.WriteTimeout = app.Server.WriteTimeout // 设置连接的写超时时间
if BConfig.Listen.ListenTCP4 {
server.Network = "tcp4"
}
if err := server.ListenAndServe(); err != nil {
logs.Critical("ListenAndServe: ", err, fmt.Sprintf("%d", os.Getpid()))
time.Sleep(100 * time.Microsecond)
endRunning <- true
}
}()
}
<-endRunning
return
}
<-endRunning
}
注意红色部分,此代码为之前版本代码,只需把新版本的换成红色部分就ok了;(新版本对于grace.servce 的ln 属性没能赋值,且child 进程也没很好处理)
