首页 文章 beegov2.0.* grace 热重启失败临时解决方...

beegov2.0.* grace 热重启失败临时解决方案

发布时间:2021-07-14 15:07:30 作者:Soul-Yang 阅读量:469
// 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 进程也没很好处理)




  
留言
https://blog.key9.cn/
用户登录
您还没有写任何评论内容!
您已经评论过了!
只能赞一次哦!
您已经收藏啦!