diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java index 18687736cfc0..228abd915fb7 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java @@ -362,9 +362,17 @@ private void unsubscribe(String id, @Nullable StompHeaders headers) { @Override public void disconnect() { + disconnect(null); + } + + @Override + public void disconnect(@Nullable StompHeaders headers) { this.closing = true; try { StompHeaderAccessor accessor = createHeaderAccessor(StompCommand.DISCONNECT); + if (headers != null) { + accessor.addNativeHeaders(headers); + } Message message = createMessage(accessor, EMPTY_PAYLOAD); execute(message); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java index 703f4ee1c0c9..61e0b68489de 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java @@ -116,6 +116,13 @@ public interface StompSession { */ void disconnect(); + /** + * Variant of {@link #disconnect()} with headers. + * @param headers the headers for the disconnect message frame + * @since 5.2.2 + */ + void disconnect(StompHeaders headers); + /** * A handle to use to track receipts. diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java index 1b744a278fde..7f979b54213e 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/DefaultStompSessionTests.java @@ -659,4 +659,25 @@ public void disconnect() { verifyNoMoreInteractions(this.sessionHandler); } + @Test + public void disconnectWithHeaders() { + this.session.afterConnected(this.connection); + assertThat(this.session.isConnected()).isTrue(); + + StompHeaders headers = new StompHeaders(); + headers.add("foo", "bar"); + + this.session.disconnect(headers); + + Message message = this.messageCaptor.getValue(); + StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); + headers = StompHeaders.readOnlyStompHeaders(accessor.getNativeHeaders()); + assertThat(headers.size()).as(headers.toString()).isEqualTo(1); + assertThat(headers.get("foo").size()).isEqualTo(1); + assertThat(headers.get("foo").get(0)).isEqualTo("bar"); + + assertThat(this.session.isConnected()).isFalse(); + verifyNoMoreInteractions(this.sessionHandler); + } + }