修复进程关闭时WebSocket没有执行onClose方法的BUG
This commit is contained in:
@@ -802,7 +802,10 @@ public abstract class WebSocket<G extends Serializable, T> {
|
||||
* 显式地关闭WebSocket
|
||||
*/
|
||||
public final void close() {
|
||||
if (this._runner != null) this._runner.closeRunner(CLOSECODE_FORCED, "user close");
|
||||
if (this._runner != null) {
|
||||
CompletableFuture<Void> future = this._runner.closeRunner(CLOSECODE_FORCED, "user close");
|
||||
if (future != null) future.join();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -144,12 +144,12 @@ public class WebSocketEngine {
|
||||
}
|
||||
|
||||
@Comment("从WebSocketEngine删除指定WebSocket")
|
||||
void removeThenClose(WebSocket socket) {
|
||||
CompletableFuture<Void> removeThenClose(WebSocket socket) {
|
||||
Serializable userid = socket._userid;
|
||||
if (single) {
|
||||
currconns.decrementAndGet();
|
||||
websockets.remove(userid);
|
||||
if (node != null) node.disconnect(userid);
|
||||
if (node != null) return node.disconnect(userid);
|
||||
} else { //非线程安全, 在常规场景中无需锁
|
||||
List<WebSocket> list = websockets2.get(userid);
|
||||
if (list != null) {
|
||||
@@ -157,10 +157,11 @@ public class WebSocketEngine {
|
||||
list.remove(socket);
|
||||
if (list.isEmpty()) {
|
||||
websockets2.remove(userid);
|
||||
if (node != null) node.disconnect(userid);
|
||||
if (node != null) return node.disconnect(userid);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Comment("更改WebSocket的userid")
|
||||
|
||||
@@ -80,7 +80,7 @@ public abstract class WebSocketNode {
|
||||
public final void postDestroy(AnyValue conf) {
|
||||
if (this.localEngine == null) return;
|
||||
//关掉所有本地本地WebSocket
|
||||
this.localEngine.getLocalWebSockets().forEach(g -> disconnect(g.getUserid()).join());
|
||||
this.localEngine.getLocalWebSockets().forEach(g -> g.close());
|
||||
if (sncpNodeAddresses != null && localSncpAddress != null) {
|
||||
sncpNodeAddresses.removeSetItem(SOURCE_SNCP_ADDRS_KEY, localSncpAddress);
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ class WebSocketRunner implements Runnable {
|
||||
@Override
|
||||
public void completed(Integer count, Void attachment1) {
|
||||
if (count < 1) {
|
||||
if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner(userid="+webSocket.getUserid()+") abort on read buffer count, force to close channel, live " + (System.currentTimeMillis() - webSocket.getCreatetime()) / 1000 + " seconds");
|
||||
if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner(userid=" + webSocket.getUserid() + ") abort on read buffer count, force to close channel, live " + (System.currentTimeMillis() - webSocket.getCreatetime()) / 1000 + " seconds");
|
||||
closeRunner(0, "read buffer count is " + count);
|
||||
return;
|
||||
}
|
||||
@@ -296,16 +296,17 @@ class WebSocketRunner implements Runnable {
|
||||
return closed;
|
||||
}
|
||||
|
||||
public void closeRunner(int code, String reason) {
|
||||
if (closed) return;
|
||||
public CompletableFuture<Void> closeRunner(int code, String reason) {
|
||||
if (closed) return null;
|
||||
synchronized (this) {
|
||||
if (closed) return;
|
||||
if (closed) return null;
|
||||
closed = true;
|
||||
channel.dispose();
|
||||
context.offerBuffer(readBuffer);
|
||||
readBuffer = null;
|
||||
engine.removeThenClose(webSocket);
|
||||
CompletableFuture<Void> future = engine.removeThenClose(webSocket);
|
||||
webSocket.onClose(code, reason);
|
||||
return future;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user