根据这篇文章[When does OnWebSocketClose fire in Jetty 9,OnClose
正确地为我解燃。 但我不能重新连接,因为我没有正确的情况。 (websocett是封闭的,我不能发送任何消息)OnWebSocketClose后重新连接 - 码头9.4
其中,当我可以
根据这篇文章[When does OnWebSocketClose fire in Jetty 9,OnClose
正确地为我解燃。 但我不能重新连接,因为我没有正确的情况。 (websocett是封闭的,我不能发送任何消息)OnWebSocketClose后重新连接 - 码头9.4
其中,当我可以
(n秒而不握手之后附近网络问题或由服务器超时或kickout)中的WebSocket问题重新连接我不确定如果你已经解决了这个问题,但我设法想出一个解决方案来重新连接WebSocket连接。
对于我的情况,我想重新连接我的WebSocket连接,如果@OnWebSocketError
方法被触发。起初,我实现了它这样的
实施中的:
@OnWebSocketError
public void onError(Throwable e) {
someMethodToReconnect();
}
和内部someMethodToReconnect
if (client == null) {
client = new WebSocketClient(sslContextFactory);
client.setMaxIdleTimeout(0);
}
if (socket == null) {
socket = new ReaderSocket(); // ReaderSocket is the name of my @WebSocket class
}
try {
client.start();
client.connect(socket, new URI(socketUrl), request);
} catch (Exception e) {
LOGGER.error("Unable to connect to WebSocket: ", e);
}
然而,这导致了另一个问题。如果服务器未启动,则有两种类型的错误返回。例外是java.net.ConnectException
和org.eclipse.jetty.websocket.api.UpgradeException
。
的流动将是:
java.net.ConnectException
抛出org.eclipse.jetty.websocket.api.UpgradeException
抛出而在执行甲,someMethodToReconnect
会被调用两次。
这导致实现B中
@OnWebSocketError
public void onError(Throwable e) {
if (e instanceof ConnectException) {
// Attempt to reconnect
someMethodToReconnect();
} else {
// Ignore upgrade exception
}
}
到目前为止实现B中工作正常,但我试图找出是否有将被抛出任何其他异常。
@Vantablack,其实我们不能做重新连接的onError回调方法,它可能会导致异常:
java.util.concurrent.RejectedExecutionException: Max requests per destination 1024 exceeded for HttpDestination
这里是我的解决方案: 创建一个线程之前连接:
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(2 * 1000L);
} catch (InterruptedException e) {
}
if (connClosed.get() && !connecting.get()) {
try {
connect();
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
}
}
}).start();
and set connecting=true in connect function, and connecting = false in onConnect, onError, onClose method. set connClosed=true in onError,onClose, =false in onConnect.
这样,无论在一个会话中调用onError多少次,只重新连接一次。