Skip to content

Commit 1200755

Browse files
committed
Fix issue with subscribe destination
The original fix for SPR-11423: spring-projects@32e5f57 was insufficient when using an external broker since the original destination header has to be in the "native headers" map (i.e. with STOMP headers) in order to be included in messages broadcast by the broker.
1 parent 564a555 commit 1200755

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,8 @@ public void handleMessage(Message<?> message) throws MessagingException {
175175
}
176176
if (SimpMessageType.MESSAGE.equals(SimpMessageHeaderAccessor.getMessageType(message.getHeaders()))) {
177177
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(message);
178-
if (getHeaderInitializer() != null) {
179-
getHeaderInitializer().initHeaders(headerAccessor);
180-
}
181-
headerAccessor.setHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, result.getSubscribeDestination());
178+
initHeaders(headerAccessor);
179+
headerAccessor.setNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, result.getSubscribeDestination());
182180
message = MessageBuilder.createMessage(message.getPayload(), headerAccessor.getMessageHeaders());
183181
}
184182
for (String destination : destinations) {
@@ -189,4 +187,10 @@ public void handleMessage(Message<?> message) throws MessagingException {
189187
}
190188
}
191189

190+
private void initHeaders(SimpMessageHeaderAccessor headerAccessor) {
191+
if (getHeaderInitializer() != null) {
192+
getHeaderInitializer().initHeaders(headerAccessor);
193+
}
194+
}
195+
192196
}

spring-messaging/src/test/java/org/springframework/messaging/simp/user/UserDestinationMessageHandlerTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ public void handleMessage() {
9191
ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class);
9292
Mockito.verify(this.brokerChannel).send(captor.capture());
9393

94-
assertEquals("/queue/foo-user123", SimpMessageHeaderAccessor.getDestination(captor.getValue().getHeaders()));
95-
assertEquals("/user/queue/foo", captor.getValue().getHeaders().get(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION));
94+
SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.wrap(captor.getValue());
95+
assertEquals("/queue/foo-user123", accessor.getDestination());
96+
assertEquals("/user/queue/foo", accessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION));
9697
}
9798

9899

spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,10 @@ else if (stompAccessor.getCommand() == null || StompCommand.SEND.equals(stompAcc
298298
logger.error("Ignoring message, no subscriptionId header: " + message);
299299
return;
300300
}
301-
String header = SimpMessageHeaderAccessor.ORIGINAL_DESTINATION;
302-
if (message.getHeaders().containsKey(header)) {
301+
String origDestination = stompAccessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
302+
if (origDestination != null) {
303303
stompAccessor = toMutableAccessor(stompAccessor, message);
304-
stompAccessor.setDestination((String) message.getHeaders().get(header));
304+
stompAccessor.setDestination(origDestination);
305305
}
306306
}
307307
else if (StompCommand.CONNECTED.equals(command)) {

spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public void handleMessageToClientUserDestination() {
239239
headers.setMessageId("mess0");
240240
headers.setSubscriptionId("sub0");
241241
headers.setDestination("/queue/foo-user123");
242-
headers.setHeader(StompHeaderAccessor.ORIGINAL_DESTINATION, "/user/queue/foo");
242+
headers.setNativeHeader(StompHeaderAccessor.ORIGINAL_DESTINATION, "/user/queue/foo");
243243
Message<byte[]> message = MessageBuilder.createMessage(EMPTY_PAYLOAD, headers.getMessageHeaders());
244244
this.protocolHandler.handleMessageToClient(this.session, message);
245245

0 commit comments

Comments
 (0)