diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageType.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageType.java index dfebc0938e..d0f9f8ca62 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageType.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageType.java @@ -39,6 +39,8 @@ public enum SimpMessageType { DISCONNECT, + DISCONNECT_ACK, + OTHER; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java index 77bfc88f6c..c9aaeaffe7 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java @@ -169,6 +169,11 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler { logger.debug("Processing " + accessor.getShortLogMessage(EMPTY_PAYLOAD)); } this.subscriptionRegistry.unregisterAllSubscriptions(sessionId); + SimpMessageHeaderAccessor disconnectAck = SimpMessageHeaderAccessor.create(SimpMessageType.DISCONNECT_ACK); + initHeaders(disconnectAck); + disconnectAck.setSessionId(sessionId); + Message messageOut = MessageBuilder.createMessage(EMPTY_PAYLOAD, disconnectAck.getMessageHeaders()); + getClientOutboundChannel().send(messageOut); } else if (SimpMessageType.SUBSCRIBE.equals(messageType)) { if (logger.isDebugEnabled()) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java index 13593f4a80..f36fa89382 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java @@ -16,6 +16,10 @@ package org.springframework.messaging.simp.broker; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import java.util.Collections; import org.junit.Before; @@ -24,7 +28,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; - import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.SubscribableChannel; @@ -32,9 +35,6 @@ import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; import org.springframework.messaging.support.MessageBuilder; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - /** * Unit tests for SimpleBrokerMessageHandler. * @@ -115,7 +115,12 @@ public class SimpleBrokerMessageHandlerTests { this.messageHandler.handleMessage(createMessage("/foo", "message1")); this.messageHandler.handleMessage(createMessage("/bar", "message2")); - verify(this.clientOutboundChannel, times(3)).send(this.messageCaptor.capture()); + verify(this.clientOutboundChannel, times(4)).send(this.messageCaptor.capture()); + + Message captured = this.messageCaptor.getAllValues().get(0); + assertEquals(SimpMessageType.DISCONNECT_ACK, SimpMessageHeaderAccessor.getMessageType(captured.getHeaders())); + assertEquals(sess1, SimpMessageHeaderAccessor.getSessionId(captured.getHeaders())); + assertCapturedMessage(sess2, "sub1", "/foo"); assertCapturedMessage(sess2, "sub2", "/foo"); assertCapturedMessage(sess2, "sub3", "/bar"); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java index 82663c1a64..d79afe0ab0 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java @@ -393,6 +393,10 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE if (SimpMessageType.CONNECT_ACK.equals(stompAccessor.getMessageType())) { stompAccessor = convertConnectAcktoStompConnected(stompAccessor); } + else if (SimpMessageType.DISCONNECT_ACK.equals(stompAccessor.getMessageType())) { + stompAccessor = StompHeaderAccessor.create(StompCommand.ERROR); + stompAccessor.setMessage("Session closed."); + } else if (stompAccessor.getCommand() == null || StompCommand.SEND.equals(stompAccessor.getCommand())) { stompAccessor.updateStompCommandAsServerMessage(); }