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: