This is an automated email from the ASF dual-hosted git repository. yaohaishi pushed a commit to branch 2.8.x in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit e4e4f7d3561174e0266a7dfb84db6025c97e60f0 Author: yhs0092 <[email protected]> AuthorDate: Fri Mar 21 10:13:46 2025 +0800 [SCB-2897] optimize the pause status switching concurrency control Since it's not possible to keep the VertxWebSocketAdaptor.inPauseStatus consistent with the VertxWebSocketAdaptor.vertxWebSocket pause status just by the AtomicBoolean CAS operation, it's better to use a simple synchronized code block to make the code clearer. --- .../rest/vertx/ws/VertxWebSocketAdaptor.java | 31 +++++++++++----------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java index 796a72979..3137e0f03 100644 --- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/VertxWebSocketAdaptor.java @@ -20,7 +20,6 @@ package org.apache.servicecomb.transport.rest.vertx.ws; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicBoolean; import org.apache.servicecomb.core.executor.ReactiveExecutor; import org.apache.servicecomb.swagger.invocation.InvocationType; @@ -62,7 +61,9 @@ public class VertxWebSocketAdaptor implements WebSocketAdapter { */ private final WebSocketBase vertxWebSocket; - private final AtomicBoolean inPauseStatus; + private final Object pauseLock = new Object(); + + private boolean inPauseStatus; private final String websocketSessionId; @@ -86,7 +87,7 @@ public class VertxWebSocketAdaptor implements WebSocketAdapter { : prepareSerialExecutorWrapper(workerPool); this.bizWebSocket = bizWebSocket; this.vertxWebSocket = vertxWebSocket; - inPauseStatus = new AtomicBoolean(true); + inPauseStatus = true; vertxWebSocket.pause(); // make sure the vert.x WebSocket pause status keep consistent with inPauseStatus flag // make sure the bi-direction message stream is established @@ -206,25 +207,25 @@ public class VertxWebSocketAdaptor implements WebSocketAdapter { @Override public void pause() { - if (!inPauseStatus.compareAndSet(false, true)) { - return; - } - LOGGER.info("[{}]-[{}] pause websocket", invocationType, websocketSessionId); - synchronized (this) { + synchronized (pauseLock) { + if (inPauseStatus) { + return; + } vertxWebSocket.pause(); - inPauseStatus.set(true); + inPauseStatus = true; + LOGGER.info("[{}]-[{}] pause websocket", invocationType, websocketSessionId); } } @Override public void resume() { - if (!inPauseStatus.compareAndSet(true, false)) { - return; - } - LOGGER.info("[{}]-[{}] resume websocket", invocationType, websocketSessionId); - synchronized (this) { + synchronized (pauseLock) { + if (!inPauseStatus) { + return; + } vertxWebSocket.resume(); - inPauseStatus.set(false); + inPauseStatus = false; + LOGGER.info("[{}]-[{}] resume websocket", invocationType, websocketSessionId); } }
