@@ -1143,9 +1143,11 @@ String getResponseToken(String responseInbox) {
1143
1143
1144
1144
void cleanResponses (boolean closing ) {
1145
1145
ArrayList <String > toRemove = new ArrayList <>();
1146
+ boolean wasInterrupted = false ;
1146
1147
1147
- responsesAwaiting . forEach (( key , future ) -> {
1148
+ for ( Map . Entry < String , NatsRequestCompletableFuture > entry : responsesAwaiting . entrySet ()) {
1148
1149
boolean remove = false ;
1150
+ NatsRequestCompletableFuture future = entry .getValue ();
1149
1151
if (future .hasExceededTimeout ()) {
1150
1152
remove = true ;
1151
1153
future .cancelTimedOut ();
@@ -1158,25 +1160,39 @@ else if (future.isDone()) {
1158
1160
// done should have already been removed, not sure if
1159
1161
// this even needs checking, but it won't hurt
1160
1162
remove = true ;
1163
+ try {
1164
+ future .get ();
1165
+ }
1166
+ catch (InterruptedException e ) {
1167
+ Thread .currentThread ().interrupt ();
1168
+ // we might have collected some entries already, but were interrupted
1169
+ // break out so we finish as quick as possible
1170
+ // cleanResponses will be called again anyway
1171
+ wasInterrupted = true ;
1172
+ break ;
1173
+ }
1174
+ catch (ExecutionException ignore ) {}
1161
1175
}
1162
1176
1163
1177
if (remove ) {
1164
- toRemove .add (key );
1178
+ toRemove .add (entry . getKey () );
1165
1179
statistics .decrementOutstandingRequests ();
1166
1180
}
1167
- });
1181
+ }
1168
1182
1169
- for (String token : toRemove ) {
1170
- responsesAwaiting .remove (token );
1183
+ for (String key : toRemove ) {
1184
+ responsesAwaiting .remove (key );
1171
1185
}
1172
1186
1173
- if (advancedTracking ) {
1187
+ if (advancedTracking && ! wasInterrupted ) {
1174
1188
toRemove .clear (); // just reuse this
1175
- responsesRespondedTo .forEach ((key , future ) -> {
1189
+ for (Map .Entry <String , NatsRequestCompletableFuture > entry : responsesRespondedTo .entrySet ()) {
1190
+ NatsRequestCompletableFuture future = entry .getValue ();
1176
1191
if (future .hasExceededTimeout ()) {
1177
- toRemove .add (key );
1192
+ toRemove .add (entry .getKey ());
1193
+ future .cancelTimedOut ();
1178
1194
}
1179
- });
1195
+ }
1180
1196
1181
1197
for (String token : toRemove ) {
1182
1198
responsesRespondedTo .remove (token );
0 commit comments