@@ -164,6 +164,7 @@ public WebSocket openSocket(HttpRequest request, WebSocket.Listener listener) {
164164 throw new ConnectionFailedException ("JdkWebSocket initial request execution error" , e );
165165 }
166166
167+ CompletableFuture <Integer > closed = new CompletableFuture <>();
167168 CompletableFuture <java .net .http .WebSocket > webSocketCompletableFuture =
168169 client
169170 .newWebSocketBuilder ()
@@ -222,6 +223,7 @@ public CompletionStage<?> onBinary(
222223 public CompletionStage <?> onClose (
223224 java .net .http .WebSocket webSocket , int statusCode , String reason ) {
224225 LOG .fine ("Closing websocket" );
226+ closed .complete (statusCode );
225227 listener .onClose (statusCode , reason );
226228 return null ;
227229 }
@@ -277,7 +279,24 @@ public WebSocket send(Message message) {
277279 Level .FINE ,
278280 "Sending close message, statusCode {0}, reason: {1}" ,
279281 new Object [] {statusCode , closeMessage .reason ()});
280- makeCall = () -> underlyingSocket .sendClose (statusCode , closeMessage .reason ());
282+ makeCall =
283+ () -> {
284+ CompletableFuture <java .net .http .WebSocket > future =
285+ underlyingSocket .sendClose (statusCode , closeMessage .reason ());
286+ try {
287+ closed .get (4 , TimeUnit .SECONDS );
288+ } catch (ExecutionException e ) {
289+ LOG .log (
290+ Level .WARNING ,
291+ "failed to wait for the websocket to close" ,
292+ e .getCause ());
293+ } catch (InterruptedException e ) {
294+ Thread .currentThread ().interrupt ();
295+ } catch (java .util .concurrent .TimeoutException e ) {
296+ LOG .finer ("wait for the websocket to close timed out" );
297+ }
298+ return future ;
299+ };
281300 } else {
282301 LOG .fine ("Output is closed, not sending close message" );
283302 return this ;
0 commit comments