@@ -206,13 +206,17 @@ public synchronized void unregisterProducer(final String group, final ClientChan
206
206
}
207
207
208
208
public Channel getAvailableChannel (String groupId ) {
209
+ return getAvailableChannel (groupId , null );
210
+ }
211
+
212
+ public Channel getAvailableChannel (String groupId , String clientId ) {
209
213
if (groupId == null ) {
210
214
return null ;
211
215
}
212
- List <Channel > channelList ;
216
+ List <ClientChannelInfo > channelList ;
213
217
ConcurrentHashMap <Channel , ClientChannelInfo > channelClientChannelInfoHashMap = groupChannelTable .get (groupId );
214
218
if (channelClientChannelInfoHashMap != null ) {
215
- channelList = new ArrayList <>(channelClientChannelInfoHashMap .keySet ());
219
+ channelList = new ArrayList <>(channelClientChannelInfoHashMap .values ());
216
220
} else {
217
221
log .warn ("Check transaction failed, channel table is empty. groupId={}" , groupId );
218
222
return null ;
@@ -224,25 +228,35 @@ public Channel getAvailableChannel(String groupId) {
224
228
return null ;
225
229
}
226
230
227
- Channel lastActiveChannel = null ;
231
+ Channel firstChannel = null ;
232
+ Channel secondChannel = null ;
228
233
229
234
int index = positiveAtomicCounter .incrementAndGet () % size ;
230
- Channel channel = channelList .get (index );
235
+ ClientChannelInfo clientChannel = channelList .get (index );
231
236
int count = 0 ;
232
- boolean isOk = channel .isActive () && channel .isWritable ();
237
+ boolean isOk = clientChannel .isActive () && clientChannel .isWritable ();
238
+ boolean isSendClient = clientChannel .getClientId ().equals (clientId );
239
+
233
240
while (count ++ < GET_AVAILABLE_CHANNEL_RETRY_COUNT ) {
241
+ if (isOk && isSendClient ) {
242
+ return clientChannel .getChannel ();
243
+ }
234
244
if (isOk ) {
235
- return channel ;
245
+ firstChannel = clientChannel .getChannel ();
246
+ }
247
+ if (clientChannel .isActive ()) {
248
+ secondChannel = clientChannel .getChannel ();
236
249
}
237
- if (channel .isActive ()) {
238
- lastActiveChannel = channel ;
250
+ if (clientChannel .isActive () && isSendClient ) {
251
+ secondChannel = clientChannel . getChannel () ;
239
252
}
240
253
index = (++index ) % size ;
241
- channel = channelList .get (index );
242
- isOk = channel .isActive () && channel .isWritable ();
254
+ clientChannel = channelList .get (index );
255
+ isOk = clientChannel .isActive () && clientChannel .isWritable ();
256
+ isSendClient = clientChannel .getClientId ().equals (clientId );
243
257
}
244
258
245
- return lastActiveChannel ;
259
+ return firstChannel != null ? firstChannel : secondChannel ;
246
260
}
247
261
248
262
public Channel findChannel (String clientId ) {
0 commit comments