Я работаю с 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
можно получить это требование