From a35153875f213929601a39c47f0823b310210321 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期五, 02 四月 2021 10:37:11 +0800
Subject: [PATCH] MicroFunc添加Context参数

---
 micronode.go |   74 +++++++++++++++++++++++--------------
 1 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/micronode.go b/micronode.go
index 1f9fefc..b7acf0d 100644
--- a/micronode.go
+++ b/micronode.go
@@ -7,6 +7,7 @@
 	"errors"
 	"fmt"
 	"os"
+	"sync"
 	"time"
 )
 
@@ -20,6 +21,9 @@
 	fnLog 		func(...interface{})
 
 	SubCh 		chan *MsgInfo
+
+	mtx 		sync.Mutex
+	started 	bool
 }
 
 func NewMicroNode(ctx context.Context,q chan os.Signal, serverId string, reg *RegisterInfo, fnLog func(v ...interface{})) (*MicroNode, error){
@@ -83,41 +87,51 @@
 }
 
 func (ms *MicroNode) StartClient() {
-	go ms.startHeartbeat()
+	ms.mtx.Lock()
+	defer ms.mtx.Unlock()
+	if !ms.started {
+		ms.started = true
+
+		go ms.startHeartbeat()
+	}
 }
 
 func (ms *MicroNode) StartServer(funcMap map[string]MicroFunc) {
-	ms.handlers = funcMap
+	ms.mtx.Lock()
+	if !ms.started {
+		ms.started = true
+		ms.mtx.Unlock()
 
-	go ms.startHeartbeat()
+		ms.handlers = funcMap
 
-	for {
-		select {
-		case <- ms.ctx.Done():
-			return
-		default:
-			msgS, msgR, keyR := ms.handle.GetMsg()
-			if msgS != nil {
-				//鏀跺埌鍏跺畠杩涚▼鐨勫彂甯冩秷鎭�
-				ms.printLog("Recv Sub Message:", string(msgS.Body))
-				ms.SubCh <- msgS
+		go ms.startHeartbeat()
+
+		for {
+			select {
+			case <- ms.ctx.Done():
+				return
+			default:
+				msgS, msgR, keyR := ms.handle.GetMsg()
+				if msgS != nil {
+					//鏀跺埌鍏跺畠杩涚▼鐨勫彂甯冩秷鎭�
+					ms.printLog("Recv Sub Message:", string(msgS.Body))
+					ms.SubCh <- msgS
+				}
+				if msgR != nil {
+					//鏀跺埌鍏跺畠杩涚▼鐨勮姹傛秷鎭�
+					go ms.serve(msgR, keyR)
+				}
+
+				time.Sleep(50 * time.Millisecond)
 			}
-			if msgR != nil {
-				//鏀跺埌鍏跺畠杩涚▼鐨勮姹傛秷鎭�
-				go ms.serve(msgR, keyR)
-			}
-
-			time.Sleep(50 * time.Millisecond)
 		}
+
+		//鎺ユ敹璁㈤槄鍒扮殑娑堟伅
+		//go ms.startRecvSubMsg()
+		//浣滀负server鍚姩
+		//ms.serve()
 	}
-
-
-
-
-	//鎺ユ敹璁㈤槄鍒扮殑娑堟伅
-	//go ms.startRecvSubMsg()
-	//浣滀负server鍚姩
-	//ms.serve()
+	ms.mtx.Unlock()
 }
 
 //寮�濮嬫帴鏀惰闃呮秷鎭�
@@ -284,7 +298,11 @@
 
 		if f,ok := ms.handlers[reqBody.Path];ok {
 			reqBody.SrcProc = msgR.SrcProc
-			ri = f(&reqBody)
+			ctx := Context{
+				ms,
+				ms,
+			}
+			ri = f(&ctx, &reqBody)
 			ms.printLog("call funcMap f,reply.Success:", ri.Success)
 		} else {
 			ms.printLog("ms.funcMap not eixst path: ", reqBody.Path)

--
Gitblit v1.8.0