From e17736dd0aee516600172fb55ab4c4432365b446 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 1 May 2020 16:45:25 +0100 Subject: [PATCH] Error handling improvement in AbstractSockJsSession Closes gh-24986 --- .../session/AbstractSockJsSession.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java index 26dc71ae9ced..3f33a3de8960 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractSockJsSession.java @@ -380,23 +380,32 @@ public void delegateConnectionEstablished() throws Exception { public void delegateMessages(String... messages) throws SockJsMessageDeliveryException { for (int i = 0; i < messages.length; i++) { try { - if (!isClosed()) { - this.handler.handleMessage(this, new TextMessage(messages[i])); - } - else { - List undelivered = getUndelivered(messages, i); - if (undelivered.isEmpty()) { - return; - } - throw new SockJsMessageDeliveryException(this.id, undelivered, "Session closed"); + if (isClosed()) { + logUndeliveredMessages(i, messages); + return; } + this.handler.handleMessage(this, new TextMessage(messages[i])); } catch (Exception ex) { + if (isClosed()) { + if (logger.isTraceEnabled()) { + logger.trace("Failed to handle message '" + messages[i] + "'", ex); + } + logUndeliveredMessages(i, messages); + return; + } throw new SockJsMessageDeliveryException(this.id, getUndelivered(messages, i), ex); } } } + private void logUndeliveredMessages(int index, String[] messages) { + List undelivered = getUndelivered(messages, index); + if (logger.isTraceEnabled() && !undelivered.isEmpty()) { + logger.trace("Dropped inbound message(s) due to closed session: " + undelivered); + } + } + private static List getUndelivered(String[] messages, int i) { switch (messages.length - i) { case 0: