From 41a9bf370cff977ff8afe122a7610e07fa6c3b80 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期一, 09 十月 2023 17:02:16 +0800
Subject: [PATCH] 加入serf集群

---
 nsq/nsq.go |  102 ++++++++++++++++++++++++++++++++-------------------
 1 files changed, 64 insertions(+), 38 deletions(-)

diff --git a/nsq/nsq.go b/nsq/nsq.go
index 0c293db..2035f15 100644
--- a/nsq/nsq.go
+++ b/nsq/nsq.go
@@ -6,20 +6,32 @@
 	"apsClient/model/common"
 	"apsClient/pkg/logx"
 	"apsClient/pkg/safe"
+	"basic.com/aps/nsqclient.git"
+	"context"
 	"errors"
 	"fmt"
+	"sync"
 	"time"
 )
 
-func Init() error {
+type consumerManager struct {
+	ctx     context.Context
+	clients sync.Map
+}
+
+var defaultConsumerManager *consumerManager
+
+func init() {
+	defaultConsumerManager = new(consumerManager)
+}
+
+func (c *consumerManager) init() error {
 	if len(conf.Conf.NsqConf.NodeId) <= 0 {
 		return errors.New("no NodeId")
 	}
-
 	if err := initProducer(); err != nil {
 		return err
 	}
-
 	safe.Go(func() {
 		caller := NewCaller(fmt.Sprintf(constvar.NsqTopicGetPlcAddress, conf.Conf.NsqConf.NodeId), fmt.Sprintf(constvar.NsqTopicSendPlcAddress, conf.Conf.NsqConf.NodeId))
 		var addressResult common.ResponsePlcAddress
@@ -29,40 +41,54 @@
 		}
 	})
 
-	safe.Go(func() {
-		err := Consume(fmt.Sprintf(constvar.NsqTopicScheduleTask, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId)
-		if err != nil {
-			logx.Errorf("start nsq consume err: %v", err)
-		}
-	})
-
-	safe.Go(func() {
-		err := Consume(fmt.Sprintf(constvar.NsqTopicSendPlcAddress, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId)
-		if err != nil {
-			logx.Errorf("start nsq consume err: %v", err)
-		}
-	})
-
-	safe.Go(func() {
-		err := Consume(fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId)
-		if err != nil {
-			logx.Errorf("start nsq consume err: %v", err)
-		}
-	})
-
-	safe.Go(func() {
-		err := Consume(fmt.Sprintf(constvar.NsqTopicApsProcessParams, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId)
-		if err != nil {
-			logx.Errorf("start nsq consume err: %v", err)
-		}
-	})
-
-	safe.Go(func() {
-		err := Consume(fmt.Sprintf(constvar.NsqTopicDeviceUpdate, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId)
-		if err != nil {
-			logx.Errorf("start nsq consume err: %v", err)
-		}
-	})
-
+	var topics = []string{
+		constvar.NsqTopicScheduleTask,
+		constvar.NsqTopicSendPlcAddress,
+		constvar.NsqTopicProcessParamsResponse,
+		constvar.NsqTopicApsProcessParams,
+		constvar.NsqTopicDeviceUpdate,
+	}
+	for _, t := range topics {
+		topic := fmt.Sprintf(t, conf.Conf.NsqConf.NodeId)
+		c.AddConsumer(topic)
+	}
 	return nil
 }
+
+func (c *consumerManager) AddConsumer(topic string) {
+	client, err := NewConsumer(topic, conf.Conf.System.DeviceId)
+	if err != nil {
+		logx.Errorf("start nsq consume err: %v", err)
+	}
+	c.clients.Store(topic, client)
+	safe.Go(func() {
+		if len(conf.Conf.NsqConf.NsqlookupdAddr) > 0 {
+			if err = client.RunLookupd(conf.Conf.NsqConf.NsqlookupdAddr, 1); err != nil {
+				logx.Errorf("RunLookupd err:%v", err)
+				return
+			}
+		} else {
+			if err = client.Run(conf.Conf.NsqConf.NsqdAddr, 1); err != nil {
+				logx.Errorf("Run err:%v", err)
+				return
+			}
+		}
+	})
+}
+
+func (c *consumerManager) stop() {
+	c.clients.Range(func(key, value any) bool {
+		if consumer, ok := value.(*nsqclient.NsqConsumer); ok {
+			nsqclient.DestroyNsqConsumer(consumer)
+		}
+		return true
+	})
+}
+
+func Init() error {
+	return defaultConsumerManager.init()
+}
+
+func Stop() {
+	defaultConsumerManager.stop()
+}

--
Gitblit v1.8.0