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 7211c97049..515f55333f 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 @@ -396,7 +396,12 @@ public abstract class AbstractSockJsSession implements SockJsSession { if (!isClosed()) { try { updateLastActiveTime(); - cancelHeartbeat(); + // Avoid cancelHeartbeat() and responseLock within server "close" callback + ScheduledFuture future = this.heartbeatFuture; + if (future != null) { + this.heartbeatFuture = null; + future.cancel(false); + } } finally { this.state = State.CLOSED; @@ -446,7 +451,7 @@ public abstract class AbstractSockJsSession implements SockJsSession { @Override public void run() { synchronized (responseLock) { - if (!this.expired) { + if (!this.expired && !isClosed()) { try { sendHeartbeat(); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java index 8135623027..a2299ac6d5 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/SockJsSessionTests.java @@ -144,7 +144,6 @@ public class SockJsSessionTests extends AbstractSockJsSessionTests