From 8324f872ef3a4d0c978a9b1d062800c6a1701c12 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 01 十二月 2023 09:58:17 +0800 Subject: [PATCH] fix --- nsq/nsq.go | 105 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 88 insertions(+), 17 deletions(-) diff --git a/nsq/nsq.go b/nsq/nsq.go index f0eb882..c447e8b 100644 --- a/nsq/nsq.go +++ b/nsq/nsq.go @@ -3,43 +3,114 @@ import ( "apsClient/conf" "apsClient/constvar" - "apsClient/model/common" "apsClient/pkg/logx" + "apsClient/pkg/nsqclient" "apsClient/pkg/safe" + "context" "errors" "fmt" - "time" + "github.com/shirou/gopsutil/net" + "sync" + "sync/atomic" ) -func Init() error { +type consumerManager struct { + ctx context.Context + clients sync.Map + initFlag int32 +} + +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 !atomic.CompareAndSwapInt32(&c.initFlag, 0, 1) { + return nil + } if err := initProducer(); err != nil { return err } + var topics = []string{ + constvar.NsqTopicScheduleTask, + constvar.NsqTopicApsProcessParams, + constvar.NsqTopicDeviceUpdate, + constvar.NsqTopicPullDataResponse, + } + for _, t := range topics { + topic := fmt.Sprintf(t, conf.Conf.NsqConf.NodeId) + c.AddConsumer(topic) + } + return nil +} +func (c *consumerManager) AddConsumer(topic string) { 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 - err := caller.Call(common.RequestPlcAddress{DeviceId: conf.Conf.System.DeviceId}, &addressResult, time.Second*2) + client, err := NewConsumer(topic, conf.Conf.System.DeviceId) if err != nil { - logx.Infof("get plc address err: %v", err.Error()) + logx.Errorf("start nsq consume err: %v", err) + } + c.clients.Store(topic, client) + logx.Infof("add consumer success, topic:%v", topic) + 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 + } } }) +} - safe.Go(func() { - _ = Consume(fmt.Sprintf(constvar.NsqTopicScheduleTask, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId) +func (c *consumerManager) stop() { + if !atomic.CompareAndSwapInt32(&c.initFlag, 1, 0) { + return + } + c.clients.Range(func(key, value any) bool { + if consumer, ok := value.(*nsqclient.NsqConsumer); ok { + nsqclient.DestroyNsqConsumer(consumer) + logx.Infof("try stop consumer, topic : %v", key) + consumer = nil + c.clients.Delete(key) + } + return true }) +} - safe.Go(func() { - _ = Consume(fmt.Sprintf(constvar.NsqTopicSendPlcAddress, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId) - }) +func (c *consumerManager) ping() bool { + connections, err := net.Connections("inet") + if err != nil { + fmt.Println("Error:", err) + return false + } + for _, conn := range connections { + ipPort := fmt.Sprintf("%s:%d", conn.Raddr.IP, conn.Raddr.Port) + fmt.Println("net.Connections ipPort", ipPort) + if ipPort == conf.Conf.NsqConf.NsqdAddr && conn.Status == "ESTABLISHED" { + return true + } + } + return false +} - safe.Go(func() { - _ = Consume(fmt.Sprintf(constvar.NsqTopicProcessParamsResponse, conf.Conf.NsqConf.NodeId), conf.Conf.System.DeviceId) - }) +func Init() error { + return defaultConsumerManager.init() +} - return nil +func Ping() bool { + return defaultConsumerManager.ping() +} + +func Stop() { + defaultConsumerManager.stop() + StopProducer() } -- Gitblit v1.8.0