Files
exchange_go/config/serverinit/usersubscribeinit.go
2025-09-19 15:42:51 +08:00

128 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}
}