124 lines
2.2 KiB
Go
124 lines
2.2 KiB
Go
package mesqueue
|
|
|
|
import (
|
|
"fmt"
|
|
"goutil/fileUtil"
|
|
"goutil/logUtilPlus"
|
|
"goutil/webUtil"
|
|
"time"
|
|
)
|
|
|
|
type GameMsg struct {
|
|
|
|
//订单id
|
|
OrderID int64
|
|
|
|
//玩家id
|
|
PlayerID string
|
|
|
|
//区服id
|
|
ServerID int64
|
|
|
|
//游戏id
|
|
GameId string
|
|
|
|
//充值金额
|
|
price int64
|
|
|
|
// 充值商品id
|
|
storeId int64
|
|
|
|
// 推送次数
|
|
pushCount int32
|
|
}
|
|
|
|
var (
|
|
//消息队列
|
|
msgQueue = make(chan GameMsg, 100)
|
|
|
|
fileName = "ErrPushMsg"
|
|
)
|
|
|
|
func init() {
|
|
go ConsumeQueue()
|
|
}
|
|
|
|
// AddQueue 添加消息队列
|
|
func AddQueue(gameMsg GameMsg) {
|
|
msgQueue <- gameMsg
|
|
}
|
|
|
|
// ConsumeQueue 消费消息队列
|
|
func ConsumeQueue() {
|
|
//捕获异常
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
//TODO 捕获异常
|
|
logUtilPlus.ErrorLog("推送充值信息到game异常 err:%s", err)
|
|
|
|
//重新开启
|
|
restartConsumer()
|
|
}
|
|
}()
|
|
|
|
for {
|
|
gameMsg := <-msgQueue
|
|
|
|
url := fmt.Sprintf("http://www.game.com/pay %s", gameMsg.GameId)
|
|
|
|
//消费消息队列 推送重置信息到game
|
|
result, err := webUtil.GetWebData(url, map[string]string{})
|
|
if err != nil {
|
|
logUtilPlus.ErrorLog("推送充值信息到game异常 err:%s", err)
|
|
|
|
//放入消息队列重新推送
|
|
if gameMsg.pushCount < 3 {
|
|
msgQueue <- gameMsg
|
|
gameMsg.pushCount++
|
|
} else { //加入文件放弃推送
|
|
WriteErrPushMsg(url)
|
|
}
|
|
}
|
|
|
|
if string(result) != "" {
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// WriteErrPushMsg 推送异常消息 写入文件
|
|
func WriteErrPushMsg(messages string) {
|
|
|
|
//文件名拼接
|
|
filePath := fileName + "/" + time.Now().Format("2006-01-02")
|
|
fileName := time.Now().Format("2006-01-02 09") + ".txt"
|
|
|
|
//消息 添加换行符
|
|
messages += ";\r\n"
|
|
err := fileUtil.WriteFile(filePath, fileName, true, messages)
|
|
if err != nil {
|
|
logUtilPlus.ErrorLog(" MegPush 写入文件失败 err:%s", err)
|
|
}
|
|
}
|
|
|
|
// restartConsumer 重启消费者
|
|
func restartConsumer() {
|
|
// 设置重试次数
|
|
maxRetries := 5
|
|
retryCount := 0
|
|
|
|
for {
|
|
select {
|
|
case <-time.After(5 * time.Second): // 等待5秒后重试
|
|
if retryCount >= maxRetries {
|
|
logUtilPlus.ErrorLog("消费者重启失败,达到最大重试次数")
|
|
return
|
|
}
|
|
logUtilPlus.InfoLog("重新启动消费者,重试次数: %d", retryCount+1)
|
|
go ConsumeQueue()
|
|
return
|
|
}
|
|
retryCount++
|
|
}
|
|
}
|