Package org.springframework.messaging.simp.stomp

Examples of org.springframework.messaging.simp.stomp.StompHeaderAccessor


    TextMessage textMessage = StompTextMessageBuilder.create(StompCommand.SEND).headers("destination:/foo").build();
    webSocketHandler.handleMessage(session, textMessage);

    Message<?> message = channel.messages.get(0);
    StompHeaderAccessor accessor = StompHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
    assertNotNull(accessor);
    assertFalse(accessor.isMutable());
    assertEquals(SimpMessageType.MESSAGE, accessor.getMessageType());
    assertEquals("/foo", accessor.getDestination());
  }
View Full Code Here


      return;
    }

    for (Message<byte[]> message : messages) {
      try {
        StompHeaderAccessor headerAccessor =
            MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

        if (logger.isTraceEnabled()) {
          logger.trace("From client: " + headerAccessor.getShortLogMessage(message.getPayload()));
        }

        headerAccessor.setSessionId(session.getId());
        headerAccessor.setSessionAttributes(session.getAttributes());
        headerAccessor.setUser(session.getPrincipal());
        if (!detectImmutableMessageInterceptor(outputChannel)) {
          headerAccessor.setImmutable();
        }

        if (StompCommand.CONNECT.equals(headerAccessor.getCommand())) {
          this.stats.incrementConnectCount();
        }
        else if (StompCommand.DISCONNECT.equals(headerAccessor.getCommand())) {
          this.stats.incrementDisconnectCount();
        }

        try {
          SimpAttributesContextHolder.setAttributesFromMessage(message);
          if (this.eventPublisher != null) {
            if (StompCommand.CONNECT.equals(headerAccessor.getCommand())) {
              publishEvent(new SessionConnectEvent(this, message));
            }
            else if (StompCommand.SUBSCRIBE.equals(headerAccessor.getCommand())) {
              publishEvent(new SessionSubscribeEvent(this, message));
            }
            else if (StompCommand.UNSUBSCRIBE.equals(headerAccessor.getCommand())) {
              publishEvent(new SessionUnsubscribeEvent(this, message));
            }
          }
          outputChannel.send(message);
        }
View Full Code Here

      logger.error("Error publishing " + event + ".", ex);
    }
  }

  protected void sendErrorMessage(WebSocketSession session, Throwable error) {
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR);
    headerAccessor.setMessage(error.getMessage());
    byte[] bytes = this.stompEncoder.encode(headerAccessor.getMessageHeaders(), EMPTY_PAYLOAD);
    try {
      session.sendMessage(new TextMessage(bytes));
    }
    catch (Throwable ex) {
      // Could be part of normal workflow (e.g. browser tab closed)
View Full Code Here

  public void handleMessageToClient(WebSocketSession session, Message<?> message) {
    if (!(message.getPayload() instanceof byte[])) {
      logger.error("Expected byte[] payload. Ignoring " + message + ".");
      return;
    }
    StompHeaderAccessor stompAccessor = getStompHeaderAccessor(message);
    StompCommand command = stompAccessor.getCommand();
    if (StompCommand.MESSAGE.equals(command)) {
      if (stompAccessor.getSubscriptionId() == null) {
        logger.warn("No STOMP \"subscription\" header in " + message);
      }
      String origDestination = stompAccessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
      if (origDestination != null) {
        stompAccessor = toMutableAccessor(stompAccessor, message);
        stompAccessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
        stompAccessor.setDestination(origDestination);
      }
    }
    else if (StompCommand.CONNECTED.equals(command)) {
      this.stats.incrementConnectedCount();
      stompAccessor = afterStompSessionConnected(message, stompAccessor, session);
      if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
        try {
          SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
          SimpAttributesContextHolder.setAttributes(simpAttributes);
          publishEvent(new SessionConnectedEvent(this, (Message<byte[]>) message));
        }
        finally {
          SimpAttributesContextHolder.resetAttributes();
        }
      }
    }
    try {
      byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), (byte[]) message.getPayload());
      session.sendMessage(new TextMessage(bytes));
    }
    catch (SessionLimitExceededException ex) {
      // Bad session, just get out
      throw ex;
View Full Code Here

    MessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class);
    if (accessor == null) {
      // Shouldn't happen (only broker broadcasts directly to clients)
      throw new IllegalStateException("No header accessor in " + message + ".");
    }
    StompHeaderAccessor stompAccessor;
    if (accessor instanceof StompHeaderAccessor) {
      stompAccessor = (StompHeaderAccessor) accessor;
    }
    else if (accessor instanceof SimpMessageHeaderAccessor) {
      stompAccessor = StompHeaderAccessor.wrap(message);
      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();
      }
    }
    else {
      // Shouldn't happen (only broker broadcasts directly to clients)
      throw new IllegalStateException(
View Full Code Here

   */
  private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
    String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
    Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
    Assert.notNull(message, "Original STOMP CONNECT not found in " + connectAckHeaders);
    StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
    String version;
    Set<String> acceptVersions = connectHeaders.getAcceptVersion();
    if (acceptVersions.contains("1.2")) {
      version = "1.2";
    }
    else if (acceptVersions.contains("1.1")) {
      version = "1.1";
    }
    else if (acceptVersions.isEmpty()) {
      version = null;
    }
    else {
      throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
    }
    StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);
    connectedHeaders.setVersion(version);
    connectedHeaders.setHeartbeat(0, 0); // not supported
    return connectedHeaders;
  }
View Full Code Here

      simpAttributes.sessionCompleted();
    }
  }

  private Message<byte[]> createDisconnectMessage(WebSocketSession session) {
    StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.DISCONNECT);
    if (getHeaderInitializer() != null) {
      getHeaderInitializer().initHeaders(headerAccessor);
    }
    headerAccessor.setSessionId(session.getId());
    headerAccessor.setSessionAttributes(session.getAttributes());
    headerAccessor.setUser(session.getPrincipal());
    return MessageBuilder.createMessage(EMPTY_PAYLOAD, headerAccessor.getMessageHeaders());
  }
View Full Code Here

  public void brokerChannelUsedByAnnotatedMethod() {
    TestChannel channel = this.simpleBrokerContext.getBean("brokerChannel", TestChannel.class);
    SimpAnnotationMethodMessageHandler messageHandler =
        this.simpleBrokerContext.getBean(SimpAnnotationMethodMessageHandler.class);

    StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SEND);
    headers.setSessionId("sess1");
    headers.setSessionAttributes(new ConcurrentHashMap<>());
    headers.setDestination("/foo");
    Message<?> message = MessageBuilder.createMessage(new byte[0], headers.getMessageHeaders());

    messageHandler.handleMessage(message);

    message = channel.messages.get(0);
    headers = StompHeaderAccessor.wrap(message);

    assertEquals(SimpMessageType.MESSAGE, headers.getMessageType());
    assertEquals("/bar", headers.getDestination());
    assertEquals("bar", new String((byte[]) message.getPayload()));
  }
View Full Code Here

    TestChannel channel = this.simpleBrokerContext.getBean("brokerChannel", TestChannel.class);
    UserDestinationMessageHandler messageHandler = this.simpleBrokerContext.getBean(UserDestinationMessageHandler.class);

    this.simpleBrokerContext.getBean(UserSessionRegistry.class).registerSessionId("joe", "s1");

    StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SEND);
    headers.setDestination("/user/joe/foo");
    Message<?> message = MessageBuilder.createMessage(new byte[0], headers.getMessageHeaders());

    messageHandler.handleMessage(message);

    message = channel.messages.get(0);
    headers = StompHeaderAccessor.wrap(message);

    assertEquals(SimpMessageType.MESSAGE, headers.getMessageType());
    assertEquals("/foo-users1", headers.getDestination());
  }
View Full Code Here

  @Test
  public void clientOutboundChannelUsedByAnnotatedMethod() {
    TestChannel channel = this.simpleBrokerContext.getBean("clientOutboundChannel", TestChannel.class);
    SimpAnnotationMethodMessageHandler messageHandler = this.simpleBrokerContext.getBean(SimpAnnotationMethodMessageHandler.class);

    StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.SUBSCRIBE);
    headers.setSessionId("sess1");
    headers.setSessionAttributes(new ConcurrentHashMap<>());
    headers.setSubscriptionId("subs1");
    headers.setDestination("/foo");
    Message<?> message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build();

    messageHandler.handleMessage(message);

    message = channel.messages.get(0);
    headers = StompHeaderAccessor.wrap(message);

    assertEquals(SimpMessageType.MESSAGE, headers.getMessageType());
    assertEquals("/foo", headers.getDestination());
    assertEquals("bar", new String((byte[]) message.getPayload()));
  }
View Full Code Here

TOP

Related Classes of org.springframework.messaging.simp.stomp.StompHeaderAccessor

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.