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  }