You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/05/03 08:38:12 UTC

[openmeetings] 01/03: [OPENMEETINGS-2301] code is improved a bit (original issue still reproducible)

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 194f3b217fee3e7f25c1945717069a18a2bc3321
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun May 3 15:14:01 2020 +0700

    [OPENMEETINGS-2301] code is improved a bit (original issue still reproducible)
---
 .../openmeetings/core/util/WebSocketHelper.java    | 32 ++++++++++++++++------
 .../openmeetings/web/room/sidebar/RoomSidebar.java |  4 +--
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
index 1584b36..30d9750 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/WebSocketHelper.java
@@ -55,31 +55,45 @@ import com.github.openjson.JSONObject;
 public class WebSocketHelper {
 	private static final Logger log = LoggerFactory.getLogger(WebSocketHelper.class);
 
-	public static void sendClient(final IWsClient inC, byte[] b) {
-		if (inC != null) {
-			sendClient(inC, c -> {
+	public static void sendClient(final IWsClient omClient, byte[] b) {
+		if (omClient != null) {
+			sendClient(omClient, c -> {
 				try {
 					c.sendMessage(b, 0, b.length);
-				} catch (IOException e) {
+				} catch (Throwable e) {
 					log.error("Error while sending binary message to client", e);
 				}
+				checkClosed(c, omClient);
 			});
 		}
 	}
 
-	public static void sendClient(final IWsClient inC, JSONObject msg) {
-		log.trace("Sending WebSocket message to Client: {} -> {}", inC, msg);
-		if (inC != null) {
-			sendClient(inC, c -> {
+	public static void sendClient(final IWsClient omClient, JSONObject msg) {
+		log.trace("Sending WebSocket message to Client: {} -> {}", omClient, msg);
+		if (omClient != null) {
+			sendClient(omClient, c -> {
 				try {
 					c.sendMessage(msg.toString());
-				} catch (IOException e) {
+				} catch (Throwable e) {
 					log.error("Error while sending message to client", e);
 				}
+				checkClosed(c, omClient);
 			});
 		}
 	}
 
+	private static void checkClosed(IWebSocketConnection c, final IWsClient omClient) {
+		if (c.isOpen()) {
+			return;
+		}
+		log.error("!!!!WS connection is closed in sendMessage");
+		WebSocketSettings settings = WebSocketSettings.Holder.get((Application)getApp());
+		IWebSocketConnectionRegistry reg = settings.getConnectionRegistry();
+		reg.removeConnection(c.getApplication(), c.getSessionId(), c.getKey());
+		if (omClient instanceof Client) {
+			getApp().getBean(IClientManager.class).exit((Client)omClient);
+		}
+	}
 	public static IApplication getApp() {
 		return (IApplication)Application.get(getWicketApplicationName());
 	}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index f328010..76bb8f1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -81,9 +81,9 @@ public class RoomSidebar extends Panel {
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			StringValue s = getRequest().getRequestParameters().getParameterValue(PARAM_SETTINGS);
-			if (!s.isEmpty()) {
+			Client c = room.getClient();
+			if (!s.isEmpty() && c != null) {
 				ExtendedClientProperties cp = WebSession.get().getExtendedProperties();
-				Client c = room.getClient();
 				cp.setSettings(new JSONObject(s.toString())).update(c);
 				if (!avInited) {
 					avInited = true;