支付宝 接入一系列修改
This commit is contained in:
@@ -17,6 +17,14 @@ var (
|
||||
modelDB *gorm.DB
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
||||
// 启动异步处理
|
||||
go ExecuteCreateChan()
|
||||
go ExecuteSaveChan()
|
||||
go ExecuteDeleteChan()
|
||||
}
|
||||
|
||||
// RegisterDBModel 注册数据库模型到全局变量dbModelMap中。
|
||||
// 这个函数接受一个interface{}类型的参数dbModel,表示数据库模型。
|
||||
// 函数的目的是将传入的数据库模型添加到全局变量dbModelMap中,
|
||||
@@ -27,7 +35,7 @@ func RegisterDBModel(dbModel interface{}) {
|
||||
dbModelMap = append(dbModelMap, &dbModel)
|
||||
}
|
||||
|
||||
// 设置modelDB 类型
|
||||
// SetModelDB 设置modelDB 类型
|
||||
func SetModelDB(db *gorm.DB) {
|
||||
modelDB = db
|
||||
}
|
||||
@@ -138,38 +146,120 @@ func Save(db *gorm.DB, value interface{}, dbIndex int32) *gorm.DB {
|
||||
return result
|
||||
}
|
||||
|
||||
// DBData 添加数据通道
|
||||
type DBData struct {
|
||||
DB *gorm.DB
|
||||
Value any
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
// 添加数据通道
|
||||
createChan = make(chan DBData)
|
||||
|
||||
// 保存数据通道
|
||||
saveChan = make(chan DBData)
|
||||
|
||||
// 删除数据通道
|
||||
deleteChan = make(chan DBData)
|
||||
)
|
||||
|
||||
// AsyncCreate 异步创建数据
|
||||
func AsyncCreate(db *gorm.DB, value interface{}) {
|
||||
|
||||
go func() {
|
||||
createChan <- DBData{
|
||||
DB: db,
|
||||
Value: value,
|
||||
}
|
||||
}
|
||||
|
||||
//检查表是否存在
|
||||
CheckTableExists(db, value)
|
||||
result := db.Create(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncCreate is err: %v", result.Error)
|
||||
// ExecuteCreateChan 执行添加数据通道
|
||||
func ExecuteCreateChan() {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
logUtilPlus.ErrorLog("AsyncCreate is err: %v", err)
|
||||
|
||||
//停止程序
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case createData := <-createChan:
|
||||
db := createData.DB
|
||||
value := createData.Value
|
||||
|
||||
//检查表是否存在
|
||||
CheckTableExists(db, value)
|
||||
result := db.Create(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncCreate is err: %v", result.Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// AsyncSave 异步保存数据
|
||||
func AsyncSave(db *gorm.DB, value interface{}) {
|
||||
|
||||
go func() {
|
||||
result := db.Save(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncSave is err : %v", result.Error)
|
||||
saveChan <- DBData{
|
||||
DB: db,
|
||||
Value: value,
|
||||
}
|
||||
}
|
||||
|
||||
// ExecuteSaveChan 执行保存数据通道
|
||||
func ExecuteSaveChan() {
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
logUtilPlus.ErrorLog("AsyncSave is err: %v", err)
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
for {
|
||||
select {
|
||||
case saveData := <-saveChan:
|
||||
db := saveData.DB
|
||||
value := saveData.Value
|
||||
|
||||
result := db.Save(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncSave is err : %v", result.Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// AsyncDelete 异步删除数据
|
||||
func AsyncDelete(db *gorm.DB, value interface{}) {
|
||||
|
||||
go func() {
|
||||
result := db.Delete(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncDelete is err : %v", result.Error)
|
||||
deleteChan <- DBData{
|
||||
DB: db,
|
||||
Value: value,
|
||||
}
|
||||
}
|
||||
|
||||
// ExecuteDeleteChan 执行删除数据通道
|
||||
func ExecuteDeleteChan() {
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
logUtilPlus.ErrorLog("AsyncDelete is err: %v", err)
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
for {
|
||||
select {
|
||||
case deleteData := <-deleteChan:
|
||||
db := deleteData.DB
|
||||
value := deleteData.Value
|
||||
|
||||
result := db.Delete(value)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("AsyncDelete is err : %v", result.Error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package httpServer
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
"common/webServer"
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package httpServer
|
||||
|
||||
import (
|
||||
config "common/configsYaml"
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
"common/webServer"
|
||||
"goutil/logUtilPlus"
|
||||
"reflect"
|
||||
|
||||
@@ -2,7 +2,7 @@ package httpServer
|
||||
|
||||
import (
|
||||
config "common/configsYaml"
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
"common/utils"
|
||||
"common/webServer"
|
||||
"encoding/json"
|
||||
|
||||
@@ -5,16 +5,7 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
/*func GetZeroTime(t int64, timezone int) int64 {
|
||||
return t - (t+int64(timezone))%86400
|
||||
}
|
||||
|
||||
func IsDiffDay(second, first int64, timezone int) int {
|
||||
secondZeroTime := GetZeroTime(second, timezone)
|
||||
firstZeroTime := GetZeroTime(first, timezone)
|
||||
return int(secondZeroTime/86400 - firstZeroTime/86400)
|
||||
}*/
|
||||
|
||||
// 计算两个时间戳之间间隔多少天
|
||||
func DiffDays(new, old int64) int64 {
|
||||
newZeroTime := ZeroTime(new, 0)
|
||||
oldZeroTime := ZeroTime(old, 0)
|
||||
@@ -27,3 +18,9 @@ func ZeroTime(sec, nsec int64) int64 {
|
||||
t, _ := time.ParseInLocation("2006-01-02", dateStr, time.Local)
|
||||
return t.Unix()
|
||||
}
|
||||
|
||||
func IsSameDay(first, second int64) bool {
|
||||
firstZero := ZeroTime(first, 0)
|
||||
secondZero := ZeroTime(second, 0)
|
||||
return firstZero == secondZero
|
||||
}
|
||||
|
||||
@@ -93,6 +93,8 @@ var (
|
||||
|
||||
// 玩家不存在
|
||||
PlayerNotExist = NewResultStatus(-1110, "PlayerNotExist")
|
||||
// 玩家uid和服务器id不匹配
|
||||
PlayerNotMatchSever = NewResultStatus(-1111, "PlayerNotMatchSever")
|
||||
|
||||
// 没有合适的玩家
|
||||
NotSuitablePlayer = NewResultStatus(-1155, "NotSuitablePlayer")
|
||||
|
||||
159
trunk/center/common/timer/timer_handler.go
Normal file
159
trunk/center/common/timer/timer_handler.go
Normal file
@@ -0,0 +1,159 @@
|
||||
package timer
|
||||
|
||||
import (
|
||||
"goutil/logUtilPlus"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 触发类型
|
||||
const (
|
||||
// TriggerTypeMinute 一分钟
|
||||
TriggerTypeMinute = iota + 1
|
||||
// TriggerTypeFiveMinute 五分钟
|
||||
TriggerTypeFiveMinute
|
||||
// TriggerTypeTenMinute 十分钟
|
||||
TriggerTypeTenMinute
|
||||
// TriggerTypeHalfHour 半小时
|
||||
TriggerTypeHalfHour
|
||||
// TriggerTypeHour 一小时
|
||||
TriggerTypeHour
|
||||
// TriggerTypeEightHour 八小时
|
||||
TriggerTypeEightHour
|
||||
// TriggerTypeDay 一天 每天0点触发
|
||||
TriggerTypeDay
|
||||
// TriggerTypeWeek 一周 (周日0点触发)
|
||||
TriggerTypeWeek
|
||||
// TriggerTypeMonth 每月1号0点触发
|
||||
TriggerTypeMonth
|
||||
)
|
||||
|
||||
// TimerHandlerFunc 定义可执行的函数类型
|
||||
type timerHandlerFunc func(nowTime time.Time) error
|
||||
|
||||
// 时间触发管理
|
||||
var (
|
||||
timerHandlerMap = make(map[int][]timerHandlerFunc)
|
||||
timerTypeMap = map[int]struct{}{
|
||||
TriggerTypeMinute: {},
|
||||
TriggerTypeFiveMinute: {},
|
||||
TriggerTypeTenMinute: {},
|
||||
TriggerTypeHalfHour: {},
|
||||
TriggerTypeHour: {},
|
||||
TriggerTypeEightHour: {},
|
||||
TriggerTypeDay: {},
|
||||
TriggerTypeWeek: {},
|
||||
TriggerTypeMonth: {},
|
||||
}
|
||||
)
|
||||
|
||||
// Register 注册时间触发器
|
||||
// @param timerType 时间触发类型
|
||||
// @param timerFunc 时间触发函数
|
||||
func Register(timerType int, timerFunc timerHandlerFunc) {
|
||||
|
||||
// 检查timerType是否在常量中
|
||||
if _, ok := timerTypeMap[timerType]; !ok {
|
||||
logUtilPlus.ErrorLog("注册时间触发器失败,类型不存在", "timerType", timerType)
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := timerHandlerMap[timerType]; !ok {
|
||||
timerHandlerMap[timerType] = make([]timerHandlerFunc, 0)
|
||||
}
|
||||
timerHandlerMap[timerType] = append(timerHandlerMap[timerType], timerFunc)
|
||||
}
|
||||
|
||||
// Execute 执行时间触发器
|
||||
// @param timerType 时间触发类型
|
||||
// @param nowTime 当前时间
|
||||
func Execute(timerType int, nowTime time.Time) {
|
||||
if _, ok := timerHandlerMap[timerType]; !ok {
|
||||
return
|
||||
}
|
||||
for _, timerHandlerFunc := range timerHandlerMap[timerType] {
|
||||
if err := timerHandlerFunc(nowTime); err != nil {
|
||||
logUtilPlus.ErrorLog("执行时间触发器失败", "timerType", timerType, "err", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化init
|
||||
func init() {
|
||||
go timerHandler()
|
||||
}
|
||||
|
||||
// 定时触发函数
|
||||
func timerHandler() {
|
||||
|
||||
// 每一分钟执行一次
|
||||
ticker := time.NewTicker(time.Minute)
|
||||
defer ticker.Stop()
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
logUtilPlus.ErrorLog("定时触发函数异常", "err", err)
|
||||
restartTimerHandler()
|
||||
}
|
||||
}()
|
||||
for {
|
||||
select {
|
||||
case nowTime := <-ticker.C:
|
||||
go func() {
|
||||
// 触发minute
|
||||
Execute(TriggerTypeMinute, nowTime)
|
||||
// 触发fiveMinute
|
||||
if nowTime.Minute()%5 == 0 {
|
||||
Execute(TriggerTypeFiveMinute, nowTime)
|
||||
}
|
||||
// 触发tenMinute
|
||||
if nowTime.Minute()%10 == 0 {
|
||||
Execute(TriggerTypeTenMinute, nowTime)
|
||||
}
|
||||
// 触发halfHour
|
||||
if nowTime.Minute()%30 == 0 {
|
||||
Execute(TriggerTypeHalfHour, nowTime)
|
||||
}
|
||||
// 触发hour
|
||||
if nowTime.Minute() == 0 {
|
||||
Execute(TriggerTypeHour, nowTime)
|
||||
}
|
||||
// 触发eightHour
|
||||
if nowTime.Hour()%8 == 0 {
|
||||
Execute(TriggerTypeEightHour, nowTime)
|
||||
}
|
||||
// 触发day 0点触发
|
||||
if nowTime.Hour() == 0 && nowTime.Minute() == 0 {
|
||||
Execute(TriggerTypeDay, nowTime)
|
||||
}
|
||||
// 触发week 周日0点触发
|
||||
if nowTime.Weekday() == time.Sunday && nowTime.Hour() == 0 && nowTime.Minute() == 0 {
|
||||
Execute(TriggerTypeWeek, nowTime)
|
||||
}
|
||||
// 触发month 1号0点触发
|
||||
if nowTime.Day() == 1 && nowTime.Hour() == 0 && nowTime.Minute() == 0 {
|
||||
Execute(TriggerTypeMonth, nowTime)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// restartTimerHandler 重启定时器
|
||||
func restartTimerHandler() {
|
||||
// 设置重试次数
|
||||
maxRetries := 5
|
||||
retryCount := 0
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-time.After(5 * time.Minute): // 等待5分钟后重试
|
||||
if retryCount >= maxRetries {
|
||||
logUtilPlus.ErrorLog("定时器重启失败,达到最大重试次数")
|
||||
return
|
||||
}
|
||||
logUtilPlus.InfoLog("重新启动定时器,重试次数: %d", retryCount+1)
|
||||
go timerHandler()
|
||||
return
|
||||
}
|
||||
retryCount++
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package webServer
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
)
|
||||
|
||||
// 处理函数
|
||||
|
||||
@@ -2,7 +2,7 @@ package webServer
|
||||
|
||||
import (
|
||||
config "common/configsYaml"
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
"goutil/logUtilPlus"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package webServer
|
||||
|
||||
import (
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
)
|
||||
|
||||
// ResponseObject
|
||||
|
||||
@@ -2,7 +2,7 @@ package webServer
|
||||
|
||||
import (
|
||||
config "common/configsYaml"
|
||||
"common/resultStatus"
|
||||
"common/resultstatus"
|
||||
"common/utils"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
Reference in New Issue
Block a user