@@ -21,7 +21,6 @@ type NodeStateChangeCallback func(state discovery.NodeState, node *discovery.Nod
21
21
22
22
type Client struct {
23
23
nc * nats.Conn
24
- sub * nats.Subscription
25
24
nodes map [string ]* discovery.Node
26
25
nodeLock sync.Mutex
27
26
ctx context.Context
@@ -30,7 +29,6 @@ type Client struct {
30
29
31
30
func (c * Client ) Close () {
32
31
c .cancel ()
33
- c .sub .Unsubscribe ()
34
32
}
35
33
36
34
// NewService create a service instance
@@ -92,19 +90,20 @@ func (c *Client) handleNatsMsg(msg *nats.Msg, callback NodeStateChangeCallback)
92
90
if _ , ok := c .nodes [nid ]; ! ok {
93
91
logger .Infof ("node.save" )
94
92
c .nodes [nid ] = & event .Node
95
- callback (discovery .NodeUp , & event .Node )
96
93
}
94
+ callback (discovery .NodeUp , & event .Node )
97
95
case discovery .Update :
98
96
if _ , ok := c .nodes [nid ]; ok {
99
97
logger .Infof ("node.update" )
100
- callback ( discovery . NodeKeepalive , & event .Node )
98
+ c . nodes [ nid ] = & event .Node
101
99
}
100
+ callback (discovery .NodeKeepalive , & event .Node )
102
101
case discovery .Delete :
103
102
if _ , ok := c .nodes [nid ]; ok {
104
103
logger .Infof ("node.delete" )
105
- callback ( discovery . NodeDown , & event . Node )
104
+ delete ( c . nodes , nid )
106
105
}
107
- delete ( c . nodes , nid )
106
+ callback ( discovery . NodeDown , & event . Node )
108
107
default :
109
108
err = fmt .Errorf ("unkonw message: %v" , msg .Data )
110
109
logger .Warnf ("handleNatsMsg: err => %v" , err )
@@ -115,24 +114,26 @@ func (c *Client) handleNatsMsg(msg *nats.Msg, callback NodeStateChangeCallback)
115
114
}
116
115
117
116
func (c * Client ) Watch (service string , handleNodeState NodeStateChangeCallback ) error {
118
- var err error
119
-
120
117
if handleNodeState == nil {
121
- err = fmt .Errorf ("Watch callback must be set for %v" , service )
118
+ err : = fmt .Errorf ("Watch callback must be set for %v" , service )
122
119
logger .Warnf ("Watch: err => %v" , err )
123
120
return err
124
121
}
125
122
126
123
subj := discovery .DefaultDiscoveryPrefix + "." + service + ".>"
127
124
msgCh := make (chan * nats.Msg )
128
125
129
- if c . sub , err = c .nc .Subscribe (subj , func (msg * nats.Msg ) {
126
+ sub , err : = c .nc .Subscribe (subj , func (msg * nats.Msg ) {
130
127
msgCh <- msg
131
- }); err != nil {
128
+ })
129
+
130
+ if err != nil {
132
131
return err
133
132
}
134
133
135
134
go func () error {
135
+ defer sub .Unsubscribe ()
136
+
136
137
for {
137
138
select {
138
139
case <- c .ctx .Done ():
0 commit comments