Example usage for org.springframework.messaging.simp.stomp StompCommand CONNECTED

List of usage examples for org.springframework.messaging.simp.stomp StompCommand CONNECTED

Introduction

In this page you can find the example usage for org.springframework.messaging.simp.stomp StompCommand CONNECTED.

Prototype

StompCommand CONNECTED

To view the source code for org.springframework.messaging.simp.stomp StompCommand CONNECTED.

Click Source Link

Usage

From source file:org.springframework.messaging.simp.stomp.DefaultStompSession.java

@Override
public void handleMessage(Message<byte[]> message) {
    StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
    Assert.state(accessor != null, "No StompHeaderAccessor");

    accessor.setSessionId(this.sessionId);
    StompCommand command = accessor.getCommand();
    Map<String, List<String>> nativeHeaders = accessor.getNativeHeaders();
    StompHeaders stompHeaders = StompHeaders.readOnlyStompHeaders(nativeHeaders);
    boolean isHeartbeat = accessor.isHeartbeat();
    if (logger.isTraceEnabled()) {
        logger.trace("Received " + accessor.getDetailedLogMessage(message.getPayload()));
    }// w w w . j a  va  2s  .c o m

    try {
        if (StompCommand.MESSAGE.equals(command)) {
            DefaultSubscription subscription = this.subscriptions.get(stompHeaders.getSubscription());
            if (subscription != null) {
                invokeHandler(subscription.getHandler(), message, stompHeaders);
            } else if (logger.isDebugEnabled()) {
                logger.debug("No handler for: " + accessor.getDetailedLogMessage(message.getPayload())
                        + ". Perhaps just unsubscribed?");
            }
        } else {
            if (StompCommand.RECEIPT.equals(command)) {
                String receiptId = stompHeaders.getReceiptId();
                ReceiptHandler handler = this.receiptHandlers.get(receiptId);
                if (handler != null) {
                    handler.handleReceiptReceived();
                } else if (logger.isDebugEnabled()) {
                    logger.debug(
                            "No matching receipt: " + accessor.getDetailedLogMessage(message.getPayload()));
                }
            } else if (StompCommand.CONNECTED.equals(command)) {
                initHeartbeatTasks(stompHeaders);
                this.version = stompHeaders.getFirst("version");
                this.sessionFuture.set(this);
                this.sessionHandler.afterConnected(this, stompHeaders);
            } else if (StompCommand.ERROR.equals(command)) {
                invokeHandler(this.sessionHandler, message, stompHeaders);
            } else if (!isHeartbeat && logger.isTraceEnabled()) {
                logger.trace("Message not handled.");
            }
        }
    } catch (Throwable ex) {
        this.sessionHandler.handleException(this, command, stompHeaders, message.getPayload(), ex);
    }
}

From source file:org.springframework.messaging.simp.stomp.StompEncoder.java

private void writeHeaders(StompCommand command, Map<String, Object> headers, byte[] payload,
        DataOutputStream output) throws IOException {

    @SuppressWarnings("unchecked")
    Map<String, List<String>> nativeHeaders = (Map<String, List<String>>) headers
            .get(NativeMessageHeaderAccessor.NATIVE_HEADERS);

    if (logger.isTraceEnabled()) {
        logger.trace("Encoding STOMP " + command + ", headers=" + nativeHeaders);
    }/*from  w ww  .  j  a v a 2s.c  o  m*/

    if (nativeHeaders == null) {
        return;
    }

    boolean shouldEscape = (command != StompCommand.CONNECT && command != StompCommand.CONNECTED);

    for (Entry<String, List<String>> entry : nativeHeaders.entrySet()) {
        if (command.requiresContentLength() && "content-length".equals(entry.getKey())) {
            continue;
        }

        List<String> values = entry.getValue();
        if (StompCommand.CONNECT.equals(command)
                && StompHeaderAccessor.STOMP_PASSCODE_HEADER.equals(entry.getKey())) {
            values = Collections.singletonList(StompHeaderAccessor.getPasscode(headers));
        }

        byte[] encodedKey = encodeHeaderKey(entry.getKey(), shouldEscape);
        for (String value : values) {
            output.write(encodedKey);
            output.write(COLON);
            output.write(encodeHeaderValue(value, shouldEscape));
            output.write(LF);
        }
    }

    if (command.requiresContentLength()) {
        int contentLength = payload.length;
        output.write("content-length:".getBytes(StandardCharsets.UTF_8));
        output.write(Integer.toString(contentLength).getBytes(StandardCharsets.UTF_8));
        output.write(LF);
    }
}

From source file:org.springframework.messaging.simp.stomp.StompProtocolHandler.java

/**
 * Handle STOMP messages going back out to WebSocket clients.
 *//*  ww w .  j a  v  a  2s  .c o m*/
@Override
public void handleMessageToClient(WebSocketSession session, Message<?> message) {

    StompHeaderAccessor headers = StompHeaderAccessor.wrap(message);
    headers.setCommandIfNotSet(StompCommand.MESSAGE);

    if (StompCommand.CONNECTED.equals(headers.getCommand())) {
        // Ignore for now since we already sent it
        return;
    }

    if (StompCommand.MESSAGE.equals(headers.getCommand()) && (headers.getSubscriptionId() == null)) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, no subscriptionId header: " + message);
        return;
    }

    if (!(message.getPayload() instanceof byte[])) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, expected byte[] content: " + message);
        return;
    }

    try {
        message = MessageBuilder.withPayloadAndHeaders(message.getPayload(), headers).build();
        byte[] bytes = this.stompMessageConverter.fromMessage(message);
        session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
    } catch (Throwable t) {
        sendErrorMessage(session, t);
    } finally {
        if (StompCommand.ERROR.equals(headers.getCommand())) {
            try {
                session.close(CloseStatus.PROTOCOL_ERROR);
            } catch (IOException e) {
            }
        }
    }
}

From source file:org.springframework.messaging.simp.stomp.StompProtocolHandler.java

protected void handleConnect(WebSocketSession session, Message<?> message) throws IOException {

    StompHeaderAccessor connectHeaders = StompHeaderAccessor.wrap(message);
    StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);

    Set<String> acceptVersions = connectHeaders.getAcceptVersion();
    if (acceptVersions.contains("1.2")) {
        connectedHeaders.setVersion("1.2");
    } else if (acceptVersions.contains("1.1")) {
        connectedHeaders.setVersion("1.1");
    } else if (acceptVersions.isEmpty()) {
        // 1.0/*ww  w  .  jav a  2 s.com*/
    } else {
        throw new StompConversionException("Unsupported version '" + acceptVersions + "'");
    }
    connectedHeaders.setHeartbeat(0, 0); // TODO

    Principal principal = session.getPrincipal();
    if (principal != null) {
        connectedHeaders.setNativeHeader(CONNECTED_USER_HEADER, principal.getName());
        connectedHeaders.setNativeHeader(QUEUE_SUFFIX_HEADER, session.getId());

        if (this.queueSuffixResolver != null) {
            String suffix = session.getId();
            this.queueSuffixResolver.addQueueSuffix(principal.getName(), session.getId(), suffix);
        }
    }

    // TODO: security

    Message<?> connectedMessage = MessageBuilder.withPayloadAndHeaders(new byte[0], connectedHeaders).build();
    byte[] bytes = this.stompMessageConverter.fromMessage(connectedMessage);
    session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
}

From source file:org.springframework.messaging.simp.stomp.StompWebSocketHandler.java

protected void handleConnect(WebSocketSession session, Message<?> message) throws IOException {

    StompHeaderAccessor connectHeaders = StompHeaderAccessor.wrap(message);
    StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);

    Set<String> acceptVersions = connectHeaders.getAcceptVersion();
    if (acceptVersions.contains("1.2")) {
        connectedHeaders.setAcceptVersion("1.2");
    } else if (acceptVersions.contains("1.1")) {
        connectedHeaders.setAcceptVersion("1.1");
    } else if (acceptVersions.isEmpty()) {
        // 1.0//from  w  ww .  j  a va2 s  .  c  o m
    } else {
        throw new StompConversionException("Unsupported version '" + acceptVersions + "'");
    }
    connectedHeaders.setHeartbeat(0, 0); // TODO

    Principal principal = session.getPrincipal();
    if (principal != null) {
        connectedHeaders.setNativeHeader(CONNECTED_USER_HEADER, principal.getName());
        connectedHeaders.setNativeHeader(QUEUE_SUFFIX_HEADER, session.getId());

        if (this.queueSuffixResolver != null) {
            String suffix = session.getId();
            this.queueSuffixResolver.addQueueSuffix(principal.getName(), session.getId(), suffix);
        }
    }

    // TODO: security

    Message<?> connectedMessage = MessageBuilder.withPayloadAndHeaders(new byte[0], connectedHeaders).build();
    byte[] bytes = this.stompMessageConverter.fromMessage(connectedMessage);
    session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
}

From source file:org.springframework.messaging.simp.stomp.StompWebSocketHandler.java

/**
 * Handle STOMP messages going back out to WebSocket clients.
 *///from  w  w  w  .j  a v a2s  .c o m
@Override
public void handleMessage(Message<?> message) {

    StompHeaderAccessor headers = StompHeaderAccessor.wrap(message);
    headers.setCommandIfNotSet(StompCommand.MESSAGE);

    if (StompCommand.CONNECTED.equals(headers.getCommand())) {
        // Ignore for now since we already sent it
        return;
    }

    String sessionId = headers.getSessionId();
    if (sessionId == null) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, no sessionId header: " + message);
        return;
    }

    WebSocketSession session = this.sessions.get(sessionId);
    if (session == null) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, sessionId not found: " + message);
        return;
    }

    if (StompCommand.MESSAGE.equals(headers.getCommand()) && (headers.getSubscriptionId() == null)) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, no subscriptionId header: " + message);
        return;
    }

    if (!(message.getPayload() instanceof byte[])) {
        // TODO: failed message delivery mechanism
        logger.error("Ignoring message, expected byte[] content: " + message);
        return;
    }

    try {
        message = MessageBuilder.withPayloadAndHeaders(message.getPayload(), headers).build();
        byte[] bytes = this.stompMessageConverter.fromMessage(message);
        session.sendMessage(new TextMessage(new String(bytes, Charset.forName("UTF-8"))));
    } catch (Throwable t) {
        sendErrorMessage(session, t);
    } finally {
        if (StompCommand.ERROR.equals(headers.getCommand())) {
            try {
                session.close(CloseStatus.PROTOCOL_ERROR);
            } catch (IOException e) {
            }
        }
    }
}

From source file:org.springframework.web.socket.messaging.StompSubProtocolHandler.java

/**
 * Handle STOMP messages going back out to WebSocket clients.
 *///ww  w .j  a va2s.co  m
@Override
@SuppressWarnings("unchecked")
public void handleMessageToClient(WebSocketSession session, Message<?> message) {
    if (!(message.getPayload() instanceof byte[])) {
        if (logger.isErrorEnabled()) {
            logger.error("Expected byte[] payload. Ignoring " + message + ".");
        }
        return;
    }

    StompHeaderAccessor accessor = getStompHeaderAccessor(message);
    StompCommand command = accessor.getCommand();

    if (StompCommand.MESSAGE.equals(command)) {
        if (accessor.getSubscriptionId() == null && logger.isWarnEnabled()) {
            logger.warn("No STOMP \"subscription\" header in " + message);
        }
        String origDestination = accessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
        if (origDestination != null) {
            accessor = toMutableAccessor(accessor, message);
            accessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
            accessor.setDestination(origDestination);
        }
    } else if (StompCommand.CONNECTED.equals(command)) {
        this.stats.incrementConnectedCount();
        accessor = afterStompSessionConnected(message, accessor, session);
        if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
            try {
                SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
                SimpAttributesContextHolder.setAttributes(simpAttributes);
                Principal user = getUser(session);
                publishEvent(this.eventPublisher,
                        new SessionConnectedEvent(this, (Message<byte[]>) message, user));
            } finally {
                SimpAttributesContextHolder.resetAttributes();
            }
        }
    }

    byte[] payload = (byte[]) message.getPayload();
    if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) {
        Message<byte[]> errorMessage = getErrorHandler().handleErrorMessageToClient((Message<byte[]>) message);
        if (errorMessage != null) {
            accessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
            Assert.state(accessor != null, "No StompHeaderAccessor");
            payload = errorMessage.getPayload();
        }
    }
    sendToClient(session, accessor, payload);
}

From source file:org.springframework.web.socket.messaging.StompSubProtocolHandler.java

/**
 * The simple broker produces {@code SimpMessageType.CONNECT_ACK} that's not STOMP
 * specific and needs to be turned into a STOMP CONNECTED frame.
 *//*from   w  ww. j av  a 2  s.co  m*/
private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
    String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
    Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
    if (message == null) {
        throw new IllegalStateException("Original STOMP CONNECT not found in " + connectAckHeaders);
    }

    StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
    StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);

    if (connectHeaders != null) {
        Set<String> acceptVersions = connectHeaders.getAcceptVersion();
        if (acceptVersions.contains("1.2")) {
            connectedHeaders.setVersion("1.2");
        } else if (acceptVersions.contains("1.1")) {
            connectedHeaders.setVersion("1.1");
        } else if (!acceptVersions.isEmpty()) {
            throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
        }
    }

    long[] heartbeat = (long[]) connectAckHeaders.getHeader(SimpMessageHeaderAccessor.HEART_BEAT_HEADER);
    if (heartbeat != null) {
        connectedHeaders.setHeartbeat(heartbeat[0], heartbeat[1]);
    } else {
        connectedHeaders.setHeartbeat(0, 0);
    }

    return connectedHeaders;
}