Лучшая практика подписки Spring STOMP — подтверждение сообщения SUBSCRIBE

Я работаю над приложением Spring, которое использует возможности веб-сокетов. Чтобы сделать его более надежным, я использовал STOMP/SimpleBrokerMessageHandler, как описано в документации. Все прошло хорошо, я смог очень быстро подключить клиент javasctipt, поэтому я переключился на работу с клиентом Android, используя библиотеку «androidasync».

Что я обнаружил, так это тот факт, что клиент Android (я полагаю, и любые другие клиенты) не получает никакой обратной связи после того, как запрос SUBSCRIBE был обработан сервером. Чтение источников SimpleBrokerMessageHandler подтверждает, что:

    if (SimpMessageType.SUBSCRIBE.equals(messageType)) {
        this.subscriptionRegistry.registerSubscription(message);
    }
    else if (SimpMessageType.UNSUBSCRIBE.equals(messageType)) {
        this.subscriptionRegistry.unregisterSubscription(message);
    }
    else if (SimpMessageType.MESSAGE.equals(messageType)) {
        sendMessageToSubscribers(headers.getDestination(), message);
    }
    else if (SimpMessageType.DISCONNECT.equals(messageType)) {
        String sessionId = headers.getSessionId();
        this.subscriptionRegistry.unregisterAllSubscriptions(sessionId);
    }
    else if (SimpMessageType.CONNECT.equals(messageType)) {
        SimpMessageHeaderAccessor replyHeaders = SimpMessageHeaderAccessor.create(SimpMessageType.CONNECT_ACK);
        replyHeaders.setSessionId(headers.getSessionId());
        replyHeaders.setHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER, message);

        Message<byte[]> connectAck = MessageBuilder.withPayload(EMPTY_PAYLOAD).setHeaders(replyHeaders).build();
        this.clientOutboundChannel.send(connectAck);
    }

Это ясно показывает, что он ничего не возвращает, кроме случая CONNECT...

Кажется, мне абсолютно необходим способ убедиться, что клиентский запрос SUBSCRIBE был обработан хорошо или отклонен, или что где-то посередине возникло исключение, или что-то в этом роде. Как я могу убедиться, что он был обработан? Каков рекомендуемый подход в этом случае?

Я не могу просто опубликовать поддельное сообщение на канале и проверить, перенаправляется ли оно обратно клиенту через подписку, потому что другие клиенты могут быть подписаны на него, поэтому они также получат это поддельное сообщение. Это не очень хороший вариант.


person Barbadoss    schedule 20.10.2014    source источник


Ответы (1)


Итак, я наткнулся на эту информацию, читая документацию STOMP.

Получение заголовка

Любой кадр клиента, кроме CONNECT, МОЖЕТ указывать заголовок квитанции с произвольным значением. Это приведет к тому, что сервер подтвердит обработку клиентского фрейма с помощью фрейма RECEIPT (см. фрейм RECEIPT для более подробной информации).

Похоже на то, что вы хотите, хотя я не подтвердил, действительно ли это делает реализация spring.

person AJD    schedule 19.03.2015
comment
Spring Simple Message Broker не реализует это: relay" rel="nofollow noreferrer">docs.spring.io/spring/docs/current/spring-framework-reference/ Простой брокер отлично подходит для начала, но поддерживает только подмножество команд STOMP (например, no аки, квитанции и т.д.)... - person Mert Mertce; 02.04.2015
comment
Этот ответ показывает способ отправки сообщения RECEIPT for SUBSCRIBE. - person mpromonet; 09.03.2018