[Java] Observe error to avoid crash (#22016) (#24843)

This commit is contained in:
Brennan 2020-08-13 20:43:28 -07:00 committed by GitHub
parent 652ea925bd
commit cd2b4bbd19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 19 additions and 2 deletions

View File

@ -4,6 +4,7 @@
package com.microsoft.signalr; package com.microsoft.signalr;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -26,6 +27,7 @@ class OkHttpWebSocketWrapper extends WebSocketWrapper {
private WebSocketOnClosedCallback onClose; private WebSocketOnClosedCallback onClose;
private CompletableSubject startSubject = CompletableSubject.create(); private CompletableSubject startSubject = CompletableSubject.create();
private CompletableSubject closeSubject = CompletableSubject.create(); private CompletableSubject closeSubject = CompletableSubject.create();
private final ReentrantLock closeLock = new ReentrantLock();
private final Logger logger = LoggerFactory.getLogger(OkHttpWebSocketWrapper.class); private final Logger logger = LoggerFactory.getLogger(OkHttpWebSocketWrapper.class);
@ -87,14 +89,29 @@ class OkHttpWebSocketWrapper extends WebSocketWrapper {
@Override @Override
public void onClosing(WebSocket webSocket, int code, String reason) { public void onClosing(WebSocket webSocket, int code, String reason) {
onClose.invoke(code, reason); onClose.invoke(code, reason);
closeSubject.onComplete(); try {
closeLock.lock();
closeSubject.onComplete();
}
finally {
closeLock.unlock();
}
checkStartFailure(); checkStartFailure();
} }
@Override @Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) { public void onFailure(WebSocket webSocket, Throwable t, Response response) {
logger.error("WebSocket closed from an error: {}.", t.getMessage()); logger.error("WebSocket closed from an error: {}.", t.getMessage());
closeSubject.onError(new RuntimeException(t));
try {
closeLock.lock();
if (!closeSubject.hasComplete()) {
closeSubject.onError(new RuntimeException(t));
}
}
finally {
closeLock.unlock();
}
onClose.invoke(null, t.getMessage()); onClose.invoke(null, t.getMessage());
checkStartFailure(); checkStartFailure();
} }