Spring Websocket (ActiveMQ): Stomp подписаться и получать сообщения в очереди из темы - PullRequest
0 голосов
/ 26 мая 2018

Я работаю с Spring WebSocket и Stomp.

Примечание : брокер ActiveMQ

У меня есть два @Schedule метода, которые отправляют сообщения Queue и Topic соответственно

Для подписки на Queue код выглядит следующим образом:

$('#ws_connect').click(function(){

    console.log('Connect clicked');

    var socket = new SockJS('/project-app/ws/notification');

    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        console.log('Connected: ' + frame);
        $('#notification').append('<p>Connected</p>');
        stompClient.subscribe('/queue/somedestination', function (notification) {
            ... append the content to the html page, it works
        });
    });

});

Если пользователя нет, Queue получает сообщение за сообщением.Как только пользователь приходит и устанавливает соединение, он автоматически получает все сообщения , помещенные в очередь и проход Queue, как пустые.Если приходит новое сообщение, оно появляется автоматически, потому что пользователь еще не подключен.Если пользователь отключается, а затем устанавливает соединение, он может снова увидеть все сообщения , поставленные в очередь .Пока здесь все в порядке

Как следует для подписки на Topic

$('#ws_connect').click(function(){

    console.log('Connect clicked');

    var socket = new SockJS('/project-app/ws/notification');

    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        console.log('Connected: ' + frame);
        $('#notification').append('<p>Connected</p>');
        stompClient.subscribe('/topic/somedestination', function (notification) {
            ... append the content to the html page, it works
        });
    });

});

Практически код js совпадает с версией Queue.Просто пункт назначения другой.

Здесь проблема заключается в том, что если существует сообщений, поставленных в очередь в Topic, и если пользователь устанавливает соединение, сообщения не появляются автоматически.Конечно, пока пользователь остается подключенным, он может видеть каждое новое сообщение, в том же случае, если несколько пользователей подключены к одному и тому же Topic, все могут видеть одно и то же новое сообщение.

Но снова для первого пользователя, который подключится к месту назначения Topic.Он не может получить сообщения , поставленные в очередь от этого Topic, когда он устанавливает соединение.

  • Это нормальное поведение?
  • Как можно извлечь сообщения, поставленные в очередь ?
  • Возможно, предложенный подход для обработки этого сценария?В каком-то смысле «худший» сценарий - создать несколько Queue с для каждого потенциального пользователя.Но просто любопытно, если через Topic можно получить это требование

1 Ответ

0 голосов
/ 26 мая 2018

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

См. Документацию для получения дополнительной помощи.

...