@@ -71,15 +71,15 @@ public ConcurrentMap<String, ConcurrentMap<Channel, ClientChannelInfo>> getGroup
71
71
public ProducerTableInfo getProducerTable () {
72
72
Map <String , List <ProducerInfo >> map = new HashMap <>();
73
73
for (String group : this .groupChannelTable .keySet ()) {
74
- for (Entry <Channel , ClientChannelInfo > entry : this .groupChannelTable .get (group ).entrySet ()) {
74
+ for (Entry <Channel , ClientChannelInfo > entry : this .groupChannelTable .get (group ).entrySet ()) {
75
75
ClientChannelInfo clientChannelInfo = entry .getValue ();
76
76
if (map .containsKey (group )) {
77
77
map .get (group ).add (new ProducerInfo (
78
- clientChannelInfo .getClientId (),
79
- clientChannelInfo .getChannel ().remoteAddress ().toString (),
80
- clientChannelInfo .getLanguage (),
81
- clientChannelInfo .getVersion (),
82
- clientChannelInfo .getLastUpdateTimestamp ()
78
+ clientChannelInfo .getClientId (),
79
+ clientChannelInfo .getChannel ().remoteAddress ().toString (),
80
+ clientChannelInfo .getLanguage (),
81
+ clientChannelInfo .getVersion (),
82
+ clientChannelInfo .getLastUpdateTimestamp ()
83
83
));
84
84
} else {
85
85
map .put (group , new ArrayList <>(Collections .singleton (new ProducerInfo (
@@ -118,8 +118,8 @@ public void scanNotActiveChannel() {
118
118
clientChannelTable .remove (info .getClientId ());
119
119
}
120
120
log .warn (
121
- "ProducerManager#scanNotActiveChannel: remove expired channel[{}] from ProducerManager groupChannelTable, producer group name: {}" ,
122
- RemotingHelper .parseChannelRemoteAddr (info .getChannel ()), group );
121
+ "ProducerManager#scanNotActiveChannel: remove expired channel[{}] from ProducerManager groupChannelTable, producer group name: {}" ,
122
+ RemotingHelper .parseChannelRemoteAddr (info .getChannel ()), group );
123
123
callProducerChangeListener (ProducerGroupEvent .CLIENT_UNREGISTER , group , info );
124
124
RemotingHelper .closeChannel (info .getChannel ());
125
125
}
@@ -144,8 +144,8 @@ public boolean doChannelCloseEvent(final String remoteAddr, final Channel channe
144
144
clientChannelTable .remove (clientChannelInfo .getClientId ());
145
145
removed = true ;
146
146
log .info (
147
- "NETTY EVENT: remove channel[{}][{}] from ProducerManager groupChannelTable, producer group: {}" ,
148
- clientChannelInfo .toString (), remoteAddr , group );
147
+ "NETTY EVENT: remove channel[{}][{}] from ProducerManager groupChannelTable, producer group: {}" ,
148
+ clientChannelInfo .toString (), remoteAddr , group );
149
149
callProducerChangeListener (ProducerGroupEvent .CLIENT_UNREGISTER , group , clientChannelInfo );
150
150
if (clientChannelInfoTable .isEmpty ()) {
151
151
ConcurrentMap <Channel , ClientChannelInfo > oldGroupTable = this .groupChannelTable .remove (group );
@@ -167,21 +167,26 @@ public void registerProducer(final String group, final ClientChannelInfo clientC
167
167
ConcurrentMap <Channel , ClientChannelInfo > channelTable = this .groupChannelTable .get (group );
168
168
if (null == channelTable ) {
169
169
channelTable = new ConcurrentHashMap <>();
170
+ // Make sure channelTable will NOT be cleaned by #scanNotActiveChannel
171
+ channelTable .put (clientChannelInfo .getChannel (), clientChannelInfo );
170
172
ConcurrentMap <Channel , ClientChannelInfo > prev = this .groupChannelTable .putIfAbsent (group , channelTable );
171
- if (null != prev ) {
173
+ if (null == prev ) {
174
+ // Add client-id to channel mapping for new producer group
175
+ clientChannelTable .put (clientChannelInfo .getClientId (), clientChannelInfo .getChannel ());
176
+ } else {
172
177
channelTable = prev ;
173
178
}
174
179
}
175
180
176
181
clientChannelInfoFound = channelTable .get (clientChannelInfo .getChannel ());
182
+ // Add client-channel info to existing producer group
177
183
if (null == clientChannelInfoFound ) {
178
184
channelTable .put (clientChannelInfo .getChannel (), clientChannelInfo );
179
185
clientChannelTable .put (clientChannelInfo .getClientId (), clientChannelInfo .getChannel ());
180
- log .info ("new producer connected, group: {} channel: {}" , group ,
181
- clientChannelInfo .toString ());
186
+ log .info ("new producer connected, group: {} channel: {}" , group , clientChannelInfo .toString ());
182
187
}
183
188
184
-
189
+ // Refresh existing client-channel-info update-timestamp
185
190
if (clientChannelInfoFound != null ) {
186
191
clientChannelInfoFound .setLastUpdateTimestamp (System .currentTimeMillis ());
187
192
}
@@ -193,8 +198,7 @@ public void unregisterProducer(final String group, final ClientChannelInfo clien
193
198
ClientChannelInfo old = channelTable .remove (clientChannelInfo .getChannel ());
194
199
clientChannelTable .remove (clientChannelInfo .getClientId ());
195
200
if (old != null ) {
196
- log .info ("unregister a producer[{}] from groupChannelTable {}" , group ,
197
- clientChannelInfo .toString ());
201
+ log .info ("unregister a producer[{}] from groupChannelTable {}" , group , clientChannelInfo .toString ());
198
202
callProducerChangeListener (ProducerGroupEvent .CLIENT_UNREGISTER , group , clientChannelInfo );
199
203
}
200
204
0 commit comments