zhangzengfei
2024-04-28 62beabfd1466fd3a6b6c0736acc8c5a3b3ec4b3b
client/client.go
@@ -1,15 +1,79 @@
package client
import (
   "context"
   "fmt"
   "math/rand"
   "time"
   "gat1400Exchange/config"
   "gat1400Exchange/pkg/logger"
   "gat1400Exchange/vo"
)
func Init1400Client() {
func Init1400Client(ctx context.Context) {
   if !config.ClientConf.Enable {
      logger.Debug("GAT/1400 Client disabled")
      return
   }
   register()
   go registerLoop(ctx)
   go keepaliveLoop(ctx)
   go syncTimeLoop(ctx)
}
func registerLoop(ctx context.Context) {
   ticker := time.NewTicker(1 * time.Second)
   for {
      select {
      case <-ctx.Done():
         unRegister()
         return
      case <-ticker.C:
         if clientStatus != vo.StatusSuccess {
            fmt.Println("register")
            if !register() {
               randNum := rand.Intn(300) + 1
               // 随机等待300s, 重新注册
               ticker.Reset(time.Duration(randNum) * time.Second)
            } else {
               ticker.Reset(1 * time.Second)
            }
         }
      }
   }
}
func keepaliveLoop(ctx context.Context) {
   var failCount int
   ticker := time.NewTicker(time.Duration(config.ClientConf.HeartbeatInterval) * time.Second)
   for {
      select {
      case <-ctx.Done():
         return
      case <-ticker.C:
         if status := keepalive(); status != vo.StatusSuccess {
            failCount++
            if failCount > config.ClientConf.HeartbeatFailCount {
               clientStatus = status
            }
         } else {
            failCount = 0
         }
      }
   }
}
func syncTimeLoop(ctx context.Context) {
   ticker := time.NewTicker(time.Duration(config.ClientConf.HeartbeatInterval*10) * time.Second)
   for {
      select {
      case <-ctx.Done():
         return
      case <-ticker.C:
         syncTime()
      }
   }
}