hliang hai 4 meses
pai
achega
039966ff10
Modificáronse 2 ficheiros con 27 adicións e 14 borrados
  1. 7 3
      core/api.go
  2. 20 11
      core/engine.go

+ 7 - 3
core/api.go

@@ -99,11 +99,15 @@ func ws(c *gin.Context) {
 		messageId := messageStruct.MessageId
 		msg := messageStruct.ResponseData
 		// 这里直接给管道塞数据,那么之前发送的时候要初始化好
-		client.actionData[action][messageId] <- msg
+		if client.actionData[action][messageId] == nil {
+			log.Warning("当前消息id:", messageId, " 已被超时释放,回调的数据不做处理")
+		} else {
+			client.actionData[action][messageId] <- msg
+		}
 		if len(msg) > 100 {
-			utils.LogPrint("get_message:", msg[:101]+"......")
+			utils.LogPrint("id", messageId, "get_message:", msg[:101]+"......")
 		} else {
-			utils.LogPrint("get_message:", msg)
+			utils.LogPrint("id", messageId, "get_message:", msg)
 		}
 
 	}

+ 20 - 11
core/engine.go

@@ -4,34 +4,43 @@ import (
 	"JsRpc/config"
 	"JsRpc/utils"
 	"encoding/json"
-	"fmt"
+	log "github.com/sirupsen/logrus"
 	"math/rand"
 	"time"
 )
 
 // GQueryFunc 发送请求到客户端
 func (c *Clients) GQueryFunc(funcName string, param string, resChan chan<- string) {
-	MessageId := utils.GetUUID()
-	WriteData := Message{Param: param, MessageId: MessageId, Action: funcName}
-	data, _ := json.Marshal(WriteData)
-	clientWs := c.clientWs
-	gm.Lock()
-	// 先判断action是否需要初始化
 	if c.actionData[funcName] == nil {
 		c.actionData[funcName] = make(map[string]chan string)
 	}
-	if c.actionData[funcName][MessageId] == nil {
-		c.actionData[funcName][MessageId] = make(chan string, 1) //此次action初始化1个消息
+	MessageId := ""
+	gm.Lock()
+	for {
+		MessageId = utils.GetUUID()
+		// 先判断action是否需要初始化
+		if c.actionData[funcName][MessageId] == nil {
+			c.actionData[funcName][MessageId] = make(chan string, 1) //此次action初始化1个消息
+			//只有不存在的MessageId才会继续,
+			break
+		} else {
+			utils.LogPrint("存在的消息id,跳过")
+		}
 	}
-	err := clientWs.WriteMessage(1, data)
 	gm.Unlock()
+	WriteData := Message{Param: param, MessageId: MessageId, Action: funcName}
+	data, _ := json.Marshal(WriteData)
+	clientWs := c.clientWs
+	err := clientWs.WriteMessage(1, data)
 	if err != nil {
-		fmt.Println(err, "写入数据失败")
+		log.Error(err, "写入数据失败")
+		resChan <- "rpc发送数据失败"
 	}
 	select {
 	case res := <-c.actionData[funcName][MessageId]:
 		resChan <- res
 	case <-time.After(time.Duration(config.DefaultTimeout) * time.Second):
+		utils.LogPrint(MessageId + "超时了")
 		resChan <- "黑脸怪:timeout"
 	}
 	// 清理资源