Я использую прочную подписку на RabbitMQ Stomp (документация here). Согласно документации, когда клиент повторно подключается (подписывается) с тем же идентификатором, он должен получить все сообщения в очереди. Тем не менее, я не могу ничего вернуть, даже если сообщения помещены в очередь на стороне сервера. Ниже приведен код, который я использую:RabbitMQ Stomp over websocket: Не удается получить сообщения в очереди
RabbitMQ Версия: 3.6.0
код клиента:
var sock;
var stomp;
var messageCount = 0;
var stompConnect = function() {
sock = new SockJS(options.url);
stomp = Stomp.over(sock);
stomp.connect({}, function(frame) {
debug('Connected: ', frame);
console.log(frame);
var id = stomp.subscribe('<url>' + options.source + "." + options.type + "." + options.id, function(d) {
console.log(messageCount);
messageCount = messageCount + 1;
}, {'auto-delete' : false, 'persistent' : true , 'id' : 'unique_id', 'ack' : 'client'});
}, function(err) {
console.log(err);
debug('error', err, err.stack);
setTimeout(stompConnect, 10);
});
};
Код сервера:
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableStompBrokerRelay("<endpoint>", "<endpoint>").setRelayHost(host)
.setSystemLogin(username).setSystemPasscode(password).setClientLogin(username)
.setClientPasscode(password);
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("<endpoint>").setAllowedOrigins("*").withSockJS();
}
}
шаги Я выполняю:
- Запустить скрипт на стороне клиента, он отправляет запрос на подписку.
- Очередь создается на стороне сервера (с именем stomp-subscription- *), все сообщения помещаются в очередь, и клиент может передавать их.
- Убить сценарий, это приводит к отключению. Журналы сервера показывают, что клиент отключен, и сообщения начинают ставиться в очередь.
- Запустите сценарий снова с тем же идентификатором. Это как-то удается подключиться к серверу, однако с сервера не возвращается сообщение. Количество сообщений в этой очереди остается неизменным (также консоль администратора RabbitMQ не показывает ни одного потребителя для этой очереди).
- Через 10 секунд соединение потеряется и следующие распечатана на бревнах клиента:
Упс! Потеряно соединение с < URL>
- Сервер также показывает одни и те же сообщения (т.е. клиент отключен). Как показано в клиентском коде, он пытается установить соединение через 10 секунд, а затем снова повторяется тот же цикл.
Я попытался следующие вещи:
- Удалены
'ack' : 'client'
заголовок. Это приводит к тому, что все сообщения выходят из очереди, однако ни один из них не доходит до клиента. Я добавил этот заголовок после прохождения this Ответ SO. - Добавлен
d.ack();
в функцию, перед тем как увеличивать messageCount. Это приводит к ошибке на стороне сервера, поскольку она пытается ответить на сообщение после закрытия сеанса (из-за отключения).
Кроме того, в некоторых случаях, когда я снова подключаюсь к количеству сообщений в очереди меньше 100, я могу получить все сообщения. Однако, когда он пересекает 100, ничего не происходит (не уверен, имеет ли это какое-либо отношение к проблеме).
Я не знаю, существует ли проблема на сервере или на стороне клиента. Любые входы?
Вы решили решить проблему? Я делаю то же самое и сталкиваюсь с точной проблемой. Сообщения, опубликованные при прерывании соединения, никогда не доставляются клиенту после восстановления связи. –