diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java index d899f59652b..a4174293cb6 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/BaseWebSession.java @@ -118,7 +118,10 @@ public void removeEventHandler(@NotNull CBWebSessionEventHandler handler) { public void migrateEventHandlersTo(@NotNull BaseWebSession target) { synchronized (sessionEventHandlers) { - sessionEventHandlers.forEach(target::addEventHandler); + for (CBWebSessionEventHandler handler : sessionEventHandlers) { + handler.handleSessionRotation(target); + target.addEventHandler(handler); + } sessionEventHandlers.clear(); } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/websocket/CBWebSessionEventHandler.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/websocket/CBWebSessionEventHandler.java index c5a8f95796d..1c21f1904c1 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/websocket/CBWebSessionEventHandler.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/websocket/CBWebSessionEventHandler.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ */ package io.cloudbeaver.websocket; +import io.cloudbeaver.model.session.BaseWebSession; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.websocket.event.WSEvent; @@ -24,4 +26,5 @@ public interface CBWebSessionEventHandler { void close(); + void handleSessionRotation(@NotNull BaseWebSession newSession); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBClientEventProcessor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBClientEventProcessor.java index 0bb70b84a5a..0cbf7b857a3 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBClientEventProcessor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBClientEventProcessor.java @@ -33,12 +33,16 @@ public class CBClientEventProcessor { private static final Log log = Log.getLog(CBClientEventProcessor.class); - final BaseWebSession webSession; + private BaseWebSession webSession; public CBClientEventProcessor(@NotNull BaseWebSession webSession) { this.webSession = webSession; } + public void setWebSession(BaseWebSession webSession) { + this.webSession = webSession; + } + public void process(@Nullable String message) { if (CommonUtils.isEmpty(message)) { return; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPolling.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPolling.java index a6ff8f82f2b..6883fad8f0a 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPolling.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsLongPolling.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,9 +40,9 @@ public class CBEventsLongPolling implements CBWebSessionEventHandler { private static final int QUEUE_CAPACITY = 1000; - private final BaseWebSession webSession; + private BaseWebSession webSession; private final BlockingQueue queue = new LinkedBlockingQueue<>(QUEUE_CAPACITY); - private final CBClientEventProcessor processor; + private CBClientEventProcessor processor; private volatile long lastPoll; public CBEventsLongPolling(@NotNull BaseWebSession webSession) { @@ -100,6 +100,12 @@ public void onMessage(@Nullable String message) { processor.process(message); } + @Override + public void handleSessionRotation(@NotNull BaseWebSession newSession) { + this.webSession = newSession; + this.processor = new CBClientEventProcessor(this.webSession); + } + @Override public void close() { webSession.removeEventHandler(this); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java index bcf71109d90..aeda9011d97 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/websockets/CBEventsWebSocket.java @@ -1,6 +1,6 @@ /* * DBeaver - Universal Database Manager - * Copyright (C) 2010-2024 DBeaver Corp and others + * Copyright (C) 2010-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,8 @@ public class CBEventsWebSocket extends CBAbstractWebSocket implements CBWebSessi @Nullable private BaseWebSession webSession; + @Nullable + private FromUserEventHandler fromUserEventHandler; @Override public void onOpen(Session session, EndpointConfig config) { @@ -48,7 +50,8 @@ public void onOpen(Session session, EndpointConfig config) { log.debug("EventWebSocket connected to the " + webSession.getSessionId() + " session"); session.setMaxIdleTimeout(Duration.ofMinutes(5).toMillis()); - session.addMessageHandler(String.class, new FromUserEventHandler(webSession)); + fromUserEventHandler = new FromUserEventHandler(webSession); + session.addMessageHandler(String.class, fromUserEventHandler); session.addMessageHandler(PongMessage.class, new WebSocketPingPongCallback(webSession)); CBJettyWebSocketManager.registerWebSocket(webSession.getSessionId(), this); @@ -76,6 +79,14 @@ public void onClose(Session session, CloseReason closeReason) { } } + @Override + public void handleSessionRotation(@NotNull BaseWebSession newSession) { + this.webSession = newSession; + if (fromUserEventHandler != null) { + fromUserEventHandler.setWebSession(newSession); + } + } + @Override public void handleWebSessionEvent(WSEvent event) { super.handleEvent(event);