@Override @Nullable protected String getDestination(Message<?> message) { return SimpMessageHeaderAccessor.getDestination(message.getHeaders()); }
private void sendInternal(Message<?> message) { String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); Assert.notNull(destination, "Destination header required"); long timeout = this.sendTimeout; boolean sent = (timeout >= 0 ? this.messageChannel.send(message, timeout) : this.messageChannel.send(message)); if (!sent) { throw new MessageDeliveryException(message, "Failed to send message to destination '" + destination + "' within timeout: " + timeout); } }
@Override public final MultiValueMap<String, String> findSubscriptions(Message<?> message) { MessageHeaders headers = message.getHeaders(); SimpMessageType type = SimpMessageHeaderAccessor.getMessageType(headers); if (!SimpMessageType.MESSAGE.equals(type)) { throw new IllegalArgumentException("Unexpected message type: " + type); } String destination = SimpMessageHeaderAccessor.getDestination(headers); if (destination == null) { if (logger.isErrorEnabled()) { logger.error("No destination in " + message); } return EMPTY_MAP; } return findSubscriptionsInternal(destination, message); }
private boolean messageCaptured(String sessionId, String subscriptionId, String destination) { for (Message<?> message : this.messageCaptor.getAllValues()) { SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message); if (sessionId.equals(headers.getSessionId())) { if (subscriptionId.equals(headers.getSubscriptionId())) { if (destination.equals(headers.getDestination())) { return true; } } } } return false; }
public void handleUnresolved(Message<?> message) { MessageHeaders headers = message.getHeaders(); if (SimpMessageHeaderAccessor.getFirstNativeHeader( SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, headers) != null) { // Re-broadcast return; } SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.wrap(message); String destination = accessor.getDestination(); accessor.setNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION, destination); accessor.setLeaveMutable(true); message = MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders()); if (logger.isTraceEnabled()) { logger.trace("Translated " + destination + " -> " + getBroadcastDestination()); } this.messagingTemplate.send(getBroadcastDestination(), message); } }
@Test public void handleSubscribe() { given(this.brokerChannel.send(Mockito.any(Message.class))).willReturn(true); this.handler.handleMessage(createWith(SimpMessageType.SUBSCRIBE, "joe", SESSION_ID, "/user/queue/foo")); ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); Mockito.verify(this.brokerChannel).send(captor.capture()); Message message = captor.getValue(); assertEquals("/queue/foo-user123", SimpMessageHeaderAccessor.getDestination(message.getHeaders())); }
@Test public void handleUnsubscribe() { given(this.brokerChannel.send(Mockito.any(Message.class))).willReturn(true); this.handler.handleMessage(createWith(SimpMessageType.UNSUBSCRIBE, "joe", "123", "/user/queue/foo")); ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); Mockito.verify(this.brokerChannel).send(captor.capture()); Message message = captor.getValue(); assertEquals("/queue/foo-user123", SimpMessageHeaderAccessor.getDestination(message.getHeaders())); }
@Test public void convertAndSendToUserWithEncoding() { this.messagingTemplate.convertAndSendToUser("http://joe.openid.example.org/", "/queue/foo", "data"); List<Message<byte[]>> messages = this.messageChannel.getMessages(); assertEquals(1, messages.size()); SimpMessageHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor(messages.get(0), SimpMessageHeaderAccessor.class); assertNotNull(headerAccessor); assertEquals("/user/http:%2F%2Fjoe.openid.example.org%2F/queue/foo", headerAccessor.getDestination()); }
@Test public void sendToDefaultDestinationWhenUsingDotPathSeparator() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); Message<?> inputMessage = createMessage("sess1", "sub1", "/app/", "dest.foo.bar", null); this.handler.handleReturnValue(PAYLOAD, this.sendToDefaultDestReturnType, inputMessage); verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals("/topic/dest.foo.bar", accessor.getDestination()); }
@Test public void sendToUserWithUserNameProvider() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new UniqueUser(); Message<?> inputMessage = createMessage(sessionId, "sub1", null, null, user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserReturnType, inputMessage); verify(this.messageChannel, times(2)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals("/user/Me myself and I/dest1", accessor.getDestination()); accessor = getCapturedAccessor(1); assertEquals("/user/Me myself and I/dest2", accessor.getDestination()); }
@Test public void handleMessageWithoutActiveSession() { this.handler.setBroadcastDestination("/topic/unresolved"); given(this.brokerChannel.send(Mockito.any(Message.class))).willReturn(true); this.handler.handleMessage(createWith(SimpMessageType.MESSAGE, "joe", "123", "/user/joe/queue/foo")); ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); Mockito.verify(this.brokerChannel).send(captor.capture()); Message message = captor.getValue(); SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.wrap(message); assertEquals("/topic/unresolved", accessor.getDestination()); assertEquals("/user/joe/queue/foo", accessor.getFirstNativeHeader(ORIGINAL_DESTINATION)); // Should ignore our own broadcast to brokerChannel this.handler.handleMessage(message); Mockito.verifyNoMoreInteractions(this.brokerChannel); }
@Test public void convertAndSendToUser() { this.messagingTemplate.convertAndSendToUser("joe", "/queue/foo", "data"); List<Message<byte[]>> messages = this.messageChannel.getMessages(); assertEquals(1, messages.size()); Message<byte[]> message = messages.get(0); SimpMessageHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor(message, SimpMessageHeaderAccessor.class); assertNotNull(headerAccessor); assertEquals(SimpMessageType.MESSAGE, headerAccessor.getMessageType()); assertEquals("/user/joe/queue/foo", headerAccessor.getDestination()); }
@Test public void handleMessage() { TestSimpUser simpUser = new TestSimpUser("joe"); simpUser.addSessions(new TestSimpSession("123")); when(this.registry.getUser("joe")).thenReturn(simpUser); given(this.brokerChannel.send(Mockito.any(Message.class))).willReturn(true); this.handler.handleMessage(createWith(SimpMessageType.MESSAGE, "joe", "123", "/user/joe/queue/foo")); ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); Mockito.verify(this.brokerChannel).send(captor.capture()); SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.wrap(captor.getValue()); assertEquals("/queue/foo-user123", accessor.getDestination()); assertEquals("/user/queue/foo", accessor.getFirstNativeHeader(ORIGINAL_DESTINATION)); }
@Test public void sendToUserDefaultDestinationWhenUsingDotPathSeparator() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); TestUser user = new TestUser(); Message<?> inputMessage = createMessage("sess1", "sub1", "/app/", "dest.foo.bar", user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserDefaultDestReturnType, inputMessage); verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals("/user/" + user.getName() + "/queue/dest.foo.bar", accessor.getDestination()); }
@Test public void sendToUserSessionWithoutUserName() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; Message<?> inputMessage = createMessage(sessionId, "sub1", null, null, null); this.handler.handleReturnValue(PAYLOAD, this.sendToUserReturnType, inputMessage); verify(this.messageChannel, times(2)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals("/user/sess1/dest1", accessor.getDestination()); assertEquals("sess1", accessor.getSessionId()); accessor = getCapturedAccessor(1); assertEquals("/user/sess1/dest2", accessor.getDestination()); assertEquals("sess1", accessor.getSessionId()); }
@Test public void convertAndSendWithCustomDestinationPrefix() { this.messagingTemplate.setUserDestinationPrefix("/prefix"); this.messagingTemplate.convertAndSendToUser("joe", "/queue/foo", "data"); List<Message<byte[]>> messages = this.messageChannel.getMessages(); assertEquals(1, messages.size()); Message<byte[]> message = messages.get(0); SimpMessageHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor(message, SimpMessageHeaderAccessor.class); assertNotNull(headerAccessor); assertEquals(SimpMessageType.MESSAGE, headerAccessor.getMessageType()); assertEquals("/prefix/joe/queue/foo", headerAccessor.getDestination()); }
@Test public void sendToUserDefaultDestination() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new TestUser(); Message<?> inputMessage = createMessage(sessionId, "sub1", "/app", "/dest", user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserDefaultDestReturnType, inputMessage); verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertNull(accessor.getSessionId()); assertNull(accessor.getSubscriptionId()); assertEquals("/user/" + user.getName() + "/queue/dest", accessor.getDestination()); }
@Test public void sendToUser() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new TestUser(); Message<?> inputMessage = createMessage(sessionId, "sub1", null, null, user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserReturnType, inputMessage); verify(this.messageChannel, times(2)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertNull(accessor.getSessionId()); assertNull(accessor.getSubscriptionId()); assertEquals("/user/" + user.getName() + "/dest1", accessor.getDestination()); accessor = getCapturedAccessor(1); assertNull(accessor.getSessionId()); assertNull(accessor.getSubscriptionId()); assertEquals("/user/" + user.getName() + "/dest2", accessor.getDestination()); }
@Test public void sendToUserDefaultDestinationSingleSession() throws Exception { given(this.messageChannel.send(any(Message.class))).willReturn(true); String sessionId = "sess1"; TestUser user = new TestUser(); Message<?> message = createMessage(sessionId, "sub1", "/app", "/dest", user); this.handler.handleReturnValue(PAYLOAD, this.sendToUserInSessionDefaultDestReturnType, message); verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); SimpMessageHeaderAccessor accessor = getCapturedAccessor(0); assertEquals(sessionId, accessor.getSessionId()); assertEquals("/user/" + user.getName() + "/queue/dest", accessor.getDestination()); assertEquals(MIME_TYPE, accessor.getContentType()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(this.sendToUserInSessionDefaultDestReturnType, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }
private void assertResponse(MethodParameter methodParameter, String sessionId, int index, String destination) { SimpMessageHeaderAccessor accessor = getCapturedAccessor(index); assertEquals(sessionId, accessor.getSessionId()); assertEquals(destination, accessor.getDestination()); assertEquals(MIME_TYPE, accessor.getContentType()); assertNull("Subscription id should not be copied", accessor.getSubscriptionId()); assertEquals(methodParameter, accessor.getHeader(SimpMessagingTemplate.CONVERSION_HINT_HEADER)); }