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