Spring websocket и Stomp.js - как долго я должен ждать между подпиской и отправкой?

У меня есть следующий код (из демонстрационного приложения spring websocket):

    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/user/queue/greeting', function(greeting) {          
            displayQueueMessage(greeting);
        });

    function sendName() {
      var name = document.getElementById('name').value;
      stompClient.send("/app/wsdemo", {}, JSON.stringify({
        'name' : name
       }));
    }

Это простой вызов подписки на очередь на сервере и еще один метод «sendName()», который отправляет вызовы на сервер.

после вызова sendName ответ сервера на функцию обратного вызова, предоставленную в методе подключения:

function(greeting) {            
    displayQueueMessage(greeting);
});

Мой вопрос: как "долго" клиент должен ждать от вызова subscribe, пока он не сможет начать вызов sendName? Я имею в виду, что потенциальная проблема, которую я вижу здесь, заключается в следующем:

i) клиент первым подписывается на очередь,

ii) клиент вызывает sendName

iii) сервер получает второй вызов до того, как он получит вызов подписки.

iv) ответ от сервера не будет получен клиентом.

мои вопросы:

1) этот сценарий действительно является проблемой?

2) как этого избежать?

3) я где-то читал, что, поскольку websocket работает с tcp, порядок сообщений сохраняется, поэтому мой последний вопрос: как насчет резервной возможности stompJS для клиентов без поддержки websocket? порядок тоже будет поддерживаться?


person Urbanleg    schedule 09.07.2014    source источник


Ответы (2)


Поскольку вы подписываетесь на очередь на этапе подключения, вам просто нужно дождаться установления соединения, прежде чем отправлять запросы на сервер.

person Alessandro Polverini    schedule 23.07.2014

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

Когда вы подписываетесь:

  stompClient.subscribe('/user/queue/greeting', function(greeting) {          
        displayQueueMessage(greeting);
    });

вы передаете функцию обратного вызова в качестве второго параметра, и когда и только когда происходит подписка (успешный запрос), ваш обратный вызов будет выполнен.

Вы можете избежать этого, если будете вызывать sendName() в обратном вызове или использовать любой другой подход для синхронизации этих двух точек.

person Ruslan    schedule 15.01.2015
comment
Этот обратный вызов выполняется, когда сообщение получено клиентом, соответствующим подписке... а не при создании подписки. - person Greg; 18.05.2017