2016-02-23 3 views
1

Я использую прочную подписку на 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 секунд, а затем снова повторяется тот же цикл.

Я попытался следующие вещи:

  1. Удалены 'ack' : 'client' заголовок. Это приводит к тому, что все сообщения выходят из очереди, однако ни один из них не доходит до клиента. Я добавил этот заголовок после прохождения this Ответ SO.
  2. Добавлен d.ack(); в функцию, перед тем как увеличивать messageCount. Это приводит к ошибке на стороне сервера, поскольку она пытается ответить на сообщение после закрытия сеанса (из-за отключения).

Кроме того, в некоторых случаях, когда я снова подключаюсь к количеству сообщений в очереди меньше 100, я могу получить все сообщения. Однако, когда он пересекает 100, ничего не происходит (не уверен, имеет ли это какое-либо отношение к проблеме).

Я не знаю, существует ли проблема на сервере или на стороне клиента. Любые входы?

+0

Вы решили решить проблему? Я делаю то же самое и сталкиваюсь с точной проблемой. Сообщения, опубликованные при прерывании соединения, никогда не доставляются клиенту после восстановления связи. –

ответ

1

Наконец-то я смог найти (и исправить) проблему. Мы используем nginx в качестве прокси, и он установил proxy_buffering на on (значение по умолчанию), посмотрите документацию here.

Это то, что он говорит:

Когда включена буферизация, Nginx получает ответ от проксируемого сервера как можно скорее, сохранив его в буфер, установленных директивами proxy_buffer_size и proxy_buffers.

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

+0

Я не прокси-сервер. Поэтому не думайте, что это проблема с нами. В любом случае, спасибо за ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^