128 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package serverinit
 | ||
| 
 | ||
| import (
 | ||
| 	"context"
 | ||
| 	"go-admin/app/admin/models"
 | ||
| 	"go-admin/app/admin/service"
 | ||
| 	"go-admin/common/const/rediskey"
 | ||
| 	"go-admin/common/global"
 | ||
| 	"go-admin/common/helper"
 | ||
| 	"go-admin/pkg/utility"
 | ||
| 	"go-admin/services/excservice"
 | ||
| 	"os"
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"github.com/bytedance/sonic"
 | ||
| 	log "github.com/go-admin-team/go-admin-core/logger"
 | ||
| 	"gorm.io/gorm"
 | ||
| )
 | ||
| 
 | ||
| // 初始化用户订阅ws连接
 | ||
| func UserSubscribeInit(orm *gorm.DB, ctx context.Context) {
 | ||
| 	var list []models.LineApiUser
 | ||
| 
 | ||
| 	err := orm.Model(&models.LineApiUser{}).Where("open_status=1 AND exchange_type =?", global.EXCHANGE_BINANCE).Find(&list).Error
 | ||
| 
 | ||
| 	if err != nil {
 | ||
| 		log.Error("获取用户api失败", err)
 | ||
| 		os.Exit(1)
 | ||
| 	}
 | ||
| 
 | ||
| 	for _, item := range list {
 | ||
| 		service.OpenUserBinanceWebsocket(item)
 | ||
| 	}
 | ||
| 
 | ||
| 	utility.SafeGo(func() {
 | ||
| 		ticker := time.NewTicker(time.Second * 5)
 | ||
| 		defer ticker.Stop()
 | ||
| 
 | ||
| 		for {
 | ||
| 			select {
 | ||
| 			case <-ctx.Done():
 | ||
| 				log.Info("ctx.Done() 被触发,原因:", ctx.Err()) // 打印上下文错误信息
 | ||
| 				return
 | ||
| 			case <-ticker.C:
 | ||
| 				deleteKeys, _ := helper.DefaultRedis.GetAllList(rediskey.ApiUserDeleteList)
 | ||
| 				activeApis, _ := helper.DefaultRedis.GetAllList(rediskey.ApiUserActiveList)
 | ||
| 
 | ||
| 				//移除连接
 | ||
| 				for _, item := range deleteKeys {
 | ||
| 					if wm, ok := excservice.SpotSockets[item]; ok {
 | ||
| 						wm.Stop()
 | ||
| 
 | ||
| 						delete(excservice.FutureSockets, item)
 | ||
| 					}
 | ||
| 
 | ||
| 					if wm, ok := excservice.SpotSockets[item]; ok {
 | ||
| 						wm.Stop()
 | ||
| 
 | ||
| 						delete(excservice.SpotSockets, item)
 | ||
| 					}
 | ||
| 
 | ||
| 					if _, err := helper.DefaultRedis.LRem(rediskey.ApiUserDeleteList, item); err != nil {
 | ||
| 						log.Error("移除 待关闭websocket 失败:", err)
 | ||
| 					}
 | ||
| 				}
 | ||
| 
 | ||
| 				//连接websocket
 | ||
| 				var apiUser models.LineApiUser
 | ||
| 				for _, item := range activeApis {
 | ||
| 					if item == "" {
 | ||
| 						continue
 | ||
| 					}
 | ||
| 
 | ||
| 					sonic.Unmarshal([]byte(item), &apiUser)
 | ||
| 
 | ||
| 					if apiUser.Id > 0 {
 | ||
| 						service.OpenUserBinanceWebsocket(apiUser)
 | ||
| 						if _, err := helper.DefaultRedis.LRem(rediskey.ApiUserActiveList, item); err != nil {
 | ||
| 							log.Error("删除 待触发的apiUser失败", err)
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 	})
 | ||
| }
 | ||
| 
 | ||
| // 重启连接
 | ||
| func RestartConnect() error {
 | ||
| 	spotSockets := excservice.SpotSockets
 | ||
| 	futuresSockets := excservice.FutureSockets
 | ||
| 	timeOut := 22 * time.Hour
 | ||
| 
 | ||
| 	for _, item := range spotSockets {
 | ||
| 		//超过22小时,重新连接
 | ||
| 		if time.Since(item.ConnectTime) > timeOut {
 | ||
| 			if err := item.ReplaceConnection(); err != nil {
 | ||
| 				log.Errorf("现货重启连接失败 key:%s,error:%s", item.GetKey(), err)
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	for _, item := range futuresSockets {
 | ||
| 		//超过22小时,重新连接
 | ||
| 		if time.Since(item.ConnectTime) > timeOut {
 | ||
| 			if err := item.ReplaceConnection(); err != nil {
 | ||
| 				log.Errorf("合约重启连接失败 key:%s,error:%s", item.GetKey(), err)
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return nil
 | ||
| }
 | ||
| 
 | ||
| // 假死重启
 | ||
| func DeadCheck() {
 | ||
| 	spotSockets := excservice.SpotSockets
 | ||
| 	futuresSockets := excservice.FutureSockets
 | ||
| 
 | ||
| 	for _, item := range spotSockets {
 | ||
| 		item.DeadCheck()
 | ||
| 	}
 | ||
| 
 | ||
| 	for _, item := range futuresSockets {
 | ||
| 		item.DeadCheck()
 | ||
| 	}
 | ||
| }
 |