github.com/zly-app/zapp@v1.3.3/service/wait_run.go (about) 1 /* 2 ------------------------------------------------- 3 Author : zlyuancn 4 date: 2020/12/14 5 Description : 6 ------------------------------------------------- 7 */ 8 9 package service 10 11 import ( 12 "time" 13 14 "go.uber.org/zap" 15 16 "github.com/zly-app/zapp/core" 17 ) 18 19 // 等待运行选项 20 type WaitRunOption struct { 21 // 服务类型 22 ServiceType core.ServiceType 23 // 如果观察阶段返回错误是否在打印错误后退出 24 ExitOnErrOfObserve bool 25 // 启动服务函数 26 RunServiceFn func() error 27 } 28 29 func WaitRun(app core.IApp, opt *WaitRunOption) error { 30 if opt.ServiceType == "" { 31 app.Fatal("ServiceType must not empty") 32 } 33 34 errChan := make(chan error, 1) 35 go func(errChan chan error) { 36 errChan <- opt.RunServiceFn() 37 }(errChan) 38 39 wait := time.NewTimer(time.Duration(app.GetConfig().Config().Frame.WaitServiceRunTime) * time.Millisecond) // 等待启动提前返回 40 select { 41 case <-wait.C: 42 case <-app.BaseContext().Done(): 43 wait.Stop() 44 return nil 45 case err := <-errChan: 46 wait.Stop() 47 return err 48 } 49 50 // 开始等待服务启动阶段2 51 go func(errChan chan error) { 52 wait = time.NewTimer(time.Duration(app.GetConfig().Config().Frame.ServiceUnstableObserveTime) * time.Millisecond) 53 select { 54 case <-wait.C: 55 case <-app.BaseContext().Done(): 56 wait.Stop() 57 case err := <-errChan: 58 wait.Stop() 59 if err == nil { 60 return 61 } 62 63 if opt.ExitOnErrOfObserve { 64 app.Fatal("服务在观察阶段检测到错误", zap.String("serviceType", string(opt.ServiceType)), zap.Error(err)) 65 } else { 66 app.Error("服务在观察阶段检测到错误", zap.String("serviceType", string(opt.ServiceType)), zap.Error(err)) 67 } 68 } 69 }(errChan) 70 71 return nil 72 }