diff --git a/flow-server/src/main/java/com/vaadin/flow/server/communication/UidlRequestHandler.java b/flow-server/src/main/java/com/vaadin/flow/server/communication/UidlRequestHandler.java index d7d2c1a76af..17b3a0f7c0e 100644 --- a/flow-server/src/main/java/com/vaadin/flow/server/communication/UidlRequestHandler.java +++ b/flow-server/src/main/java/com/vaadin/flow/server/communication/UidlRequestHandler.java @@ -20,6 +20,7 @@ import java.io.OutputStream; import java.io.StringWriter; import java.io.Writer; +import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -66,15 +67,13 @@ public class UidlRequestHandler extends SynchronizedRequestHandler implements SessionExpiredHandler { + private AtomicReference rpcHandler = new AtomicReference<>(); - private ServerRpcHandler rpcHandler; - - public static final Pattern HASH_PATTERN = Pattern.compile("window.location.hash ?= ?'(.*?)'"); + public static final Pattern HASH_PATTERN = Pattern + .compile("window.location.hash ?= ?'(.*?)'"); public static final Pattern URL_PATTERN = Pattern.compile("^(.*)#(.+)$"); - public static final String PUSH_STATE_HASH = - "setTimeout(() => history.pushState(null, null, location.pathname + location.search + '#%s'));"; - public static final String PUSH_STATE_LOCATION = - "setTimeout(() => history.pushState(null, null, '%s'));"; + public static final String PUSH_STATE_HASH = "setTimeout(() => history.pushState(null, null, location.pathname + location.search + '#%s'));"; + public static final String PUSH_STATE_LOCATION = "setTimeout(() => history.pushState(null, null, '%s'));"; private static final String SYNC_ID = '"' + SERVER_SYNC_ID + '"'; private static final String RPC = RPC_INVOCATIONS; @@ -141,8 +140,7 @@ private void writeRefresh(VaadinResponse response) throws IOException { commitJsonResponse(response, json); } - void writeUidl(UI ui, Writer writer, boolean resync) - throws IOException { + void writeUidl(UI ui, Writer writer, boolean resync) throws IOException { JsonObject uidl = createUidl(ui, resync); if (ui instanceof JavaScriptBootstrapUI) { @@ -184,11 +182,12 @@ public boolean handleSessionExpired(VaadinRequest request, } private ServerRpcHandler getRpcHandler(VaadinSession session) { - session.checkHasLock(); - if (rpcHandler == null) { - rpcHandler = createRpcHandler(); + ServerRpcHandler handler = rpcHandler.get(); + if (handler == null) { + rpcHandler.compareAndSet(null, createRpcHandler()); + handler = rpcHandler.get(); } - return rpcHandler; + return handler; } /** @@ -330,4 +329,3 @@ private String removeHashInRpc(JsonArray rpc) { return null; } } -