public void setMessageTypeIfNotSet(SimpMessageType messageType) { if (getMessageType() == null) { setHeader(MESSAGE_TYPE_HEADER, messageType); } }
@Override public boolean matches(Message<? extends Object> message) { MessageHeaders headers = message.getHeaders(); SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); return typeToMatch == messageType; }
@Override @Nullable public SimpMessageTypeMessageCondition getMatchingCondition(Message<?> message) { SimpMessageType actual = SimpMessageHeaderAccessor.getMessageType(message.getHeaders()); return (actual != null && actual.equals(this.messageType) ? this : null); }
@Override public void afterSendCompletion( Message<?> message, MessageChannel channel, boolean sent, @Nullable Exception ex) { if (!sent) { SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders()); if (SimpMessageType.DISCONNECT.equals(messageType)) { logger.debug("Detected unsent DISCONNECT message. Processing anyway."); handleMessage(message); } } } }
@Override public int compareTo(SimpMessageTypeMessageCondition other, Message<?> message) { Object actual = SimpMessageHeaderAccessor.getMessageType(message.getHeaders()); if (actual != null) { if (actual.equals(this.messageType) && actual.equals(other.getMessageType())) { return 0; } else if (actual.equals(this.messageType)) { return -1; } else if (actual.equals(other.getMessageType())) { return 1; } } return 0; }
@Override public String getShortLogMessage(Object payload) { if (getMessageType() == null) { return super.getDetailedLogMessage(payload); } StringBuilder sb = getBaseLogMessage(); if (!CollectionUtils.isEmpty(getSessionAttributes())) { sb.append(" attributes[").append(getSessionAttributes().size()).append("]"); } sb.append(getShortPayloadLogMessage(payload)); return sb.toString(); }
@Override public void handleMessage(Message<?> message) throws MessagingException { if (SimpMessageType.HEARTBEAT == SimpMessageHeaderAccessor.getMessageType(message.getHeaders())) { return; } this.queue.add(message); }
@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 StringBuilder getBaseLogMessage() { StringBuilder sb = new StringBuilder(); SimpMessageType messageType = getMessageType(); sb.append(messageType != null ? messageType.name() : SimpMessageType.OTHER); String destination = getDestination(); if (destination != null) { sb.append(" destination=").append(destination); } String subscriptionId = getSubscriptionId(); if (subscriptionId != null) { sb.append(" subscriptionId=").append(subscriptionId); } sb.append(" session=").append(getSessionId()); Principal user = getUser(); if (user != null) { sb.append(" user=").append(user.getName()); } return sb; }
@SuppressWarnings("unchecked") @Override public String getDetailedLogMessage(@Nullable Object payload) { if (getMessageType() == null) { return super.getDetailedLogMessage(payload); } StringBuilder sb = getBaseLogMessage(); if (!CollectionUtils.isEmpty(getSessionAttributes())) { sb.append(" attributes=").append(getSessionAttributes()); } if (!CollectionUtils.isEmpty((Map<String, List<String>>) getHeader(NATIVE_HEADERS))) { sb.append(" nativeHeaders=").append(getHeader(NATIVE_HEADERS)); } sb.append(getDetailedPayloadLogMessage(payload)); return sb.toString(); }
@Override public final void unregisterSubscription(Message<?> message) { MessageHeaders headers = message.getHeaders(); SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); if (!SimpMessageType.UNSUBSCRIBE.equals(messageType)) { throw new IllegalArgumentException("Expected UNSUBSCRIBE: " + message); } String sessionId = SimpMessageHeaderAccessor.getSessionId(headers); if (sessionId == null) { if (logger.isErrorEnabled()) { logger.error("No sessionId in " + message); } return; } String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers); if (subscriptionId == null) { if (logger.isErrorEnabled()) { logger.error("No subscriptionId " + message); } return; } removeSubscriptionInternal(sessionId, subscriptionId, message); }
DataOutputStream output = new DataOutputStream(baos); if (SimpMessageType.HEARTBEAT.equals(SimpMessageHeaderAccessor.getMessageType(headers))) { logger.trace("Encoding heartbeat"); output.write(StompDecoder.HEARTBEAT_PAYLOAD);
@Override public final void registerSubscription(Message<?> message) { MessageHeaders headers = message.getHeaders(); SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); if (!SimpMessageType.SUBSCRIBE.equals(messageType)) { throw new IllegalArgumentException("Expected SUBSCRIBE: " + message); } String sessionId = SimpMessageHeaderAccessor.getSessionId(headers); if (sessionId == null) { if (logger.isErrorEnabled()) { logger.error("No sessionId in " + message); } return; } String subscriptionId = SimpMessageHeaderAccessor.getSubscriptionId(headers); if (subscriptionId == null) { if (logger.isErrorEnabled()) { logger.error("No subscriptionId in " + message); } return; } String destination = SimpMessageHeaderAccessor.getDestination(headers); if (destination == null) { if (logger.isErrorEnabled()) { logger.error("No destination in " + message); } return; } addSubscriptionInternal(sessionId, subscriptionId, destination, message); }
@Nullable private ParseResult parse(Message<?> message) { MessageHeaders headers = message.getHeaders(); String sourceDestination = SimpMessageHeaderAccessor.getDestination(headers); if (sourceDestination == null || !checkDestination(sourceDestination, this.prefix)) { return null; } SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); if (messageType != null) { switch (messageType) { case SUBSCRIBE: case UNSUBSCRIBE: return parseSubscriptionMessage(message, sourceDestination); case MESSAGE: return parseMessage(headers, sourceDestination); } } return null; }
@Test public void processHeadersToSend() { Map<String, Object> map = this.messagingTemplate.processHeadersToSend(null); assertNotNull(map); assertTrue("Actual: " + map.getClass().toString(), MessageHeaders.class.isAssignableFrom(map.getClass())); SimpMessageHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor((MessageHeaders) map, SimpMessageHeaderAccessor.class); assertTrue(headerAccessor.isMutable()); assertEquals(SimpMessageType.MESSAGE, headerAccessor.getMessageType()); }
@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 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()); }
SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders()); if (SimpMessageType.CONNECT_ACK.equals(messageType)) { stompAccessor = convertConnectAcktoStompConnected(stompAccessor);
@Test public void subscribeDisconnectPublish() { String sess1 = "sess1"; String sess2 = "sess2"; startSession(sess1); startSession(sess2); this.messageHandler.handleMessage(createSubscriptionMessage(sess1, "sub1", "/foo")); this.messageHandler.handleMessage(createSubscriptionMessage(sess1, "sub2", "/foo")); this.messageHandler.handleMessage(createSubscriptionMessage(sess1, "sub3", "/bar")); this.messageHandler.handleMessage(createSubscriptionMessage(sess2, "sub1", "/foo")); this.messageHandler.handleMessage(createSubscriptionMessage(sess2, "sub2", "/foo")); this.messageHandler.handleMessage(createSubscriptionMessage(sess2, "sub3", "/bar")); SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.create(SimpMessageType.DISCONNECT); headers.setSessionId(sess1); headers.setUser(new TestPrincipal("joe")); Message<byte[]> message = MessageBuilder.createMessage(new byte[0], headers.getMessageHeaders()); this.messageHandler.handleMessage(message); this.messageHandler.handleMessage(createMessage("/foo", "message1")); this.messageHandler.handleMessage(createMessage("/bar", "message2")); verify(this.clientOutChannel, times(4)).send(this.messageCaptor.capture()); Message<?> captured = this.messageCaptor.getAllValues().get(2); assertEquals(SimpMessageType.DISCONNECT_ACK, SimpMessageHeaderAccessor.getMessageType(captured.getHeaders())); assertSame(message, captured.getHeaders().get(SimpMessageHeaderAccessor.DISCONNECT_MESSAGE_HEADER)); assertEquals(sess1, SimpMessageHeaderAccessor.getSessionId(captured.getHeaders())); assertEquals("joe", SimpMessageHeaderAccessor.getUser(captured.getHeaders()).getName()); assertTrue(messageCaptured(sess2, "sub1", "/foo")); assertTrue(messageCaptured(sess2, "sub2", "/foo")); assertTrue(messageCaptured(sess2, "sub3", "/bar")); }
@Override protected void handleMessageInternal(Message<?> message) { MessageHeaders headers = message.getHeaders(); SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers); String destination = SimpMessageHeaderAccessor.getDestination(headers); String sessionId = SimpMessageHeaderAccessor.getSessionId(headers);