ActiveMQ перестает получать сообщения после того, как серверы простаивали в течение нескольких часов

#java #activemq

#java #activemq

Вопрос:

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

Ситуация такова: внутри нашего веб-приложения Java у нас есть ActiveMQ 5.7 (я знаю, что он очень старый, в конечном итоге мы обновимся до более новой версии — но по некоторым причинам это сейчас невозможно). У нас только один брокер и несколько потребителей.

Когда я запускаю серверы (я пытался сделать это для 2, 3, 4 и более серверов), все в порядке. Серверы обмениваются данными друг с другом, сообщения из ОЧЕРЕДИ обрабатываются мгновенно. Но когда я оставляю серверы простаивающими (например, чтобы, наконец, немного поспать ;)), это больше не так. Сообщения застревают в базе данных и не используются. Единственный вариант их доставки — перезапустить сервер.

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

 BrokerServiceURI=broker:(tcp://0.0.0.0:{0})/{1}?persistent=trueamp;useJmx=falseamp;populateJMSXUserID=falseamp;useShutdownHook=falseamp;deleteAllMessagesOnStartup=falseamp;enableStatistics=true 
ConnectionFactoryURI=failover://({0})?initialReconnectDelay=100amp;timeout=6000 
ConnectionFactoryServerURI=tcp://{0}:{1}?keepAlive=trueamp;soTimeout=100amp;wireFormat.cacheEnabled=falseamp;wireFormat.tightEncodingEnabled=falseamp;wireFormat.maxInactivityDuration=0 
BrokerService.startAsync=true 
BrokerService.networkConnectorStartAsync=true 
BrokerService.keepDurableSubsActive=false
  

У вас есть ключ к разгадке?

Ответ №1:

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

  1. Можете ли вы проверить подключения потребителей?
  2. Сеансы потребителя все еще активны?
  3. Если все потребительские соединения установлены, то проверьте дамп потока, находятся ли активные потребительские потоки (я предполагаю, что вы создали потребительские потоки, поправьте меня, если я ошибаюсь) в запущенном или ОЖИДАЮЩЕМ состоянии (это произошло со мной, когда все потребители были активны, но какой-то другой поток блокировал Logger при отправке сообщения в slack, а потребители находились в состоянии ОЖИДАНИЯ) из-за какого-то другого потока на сервере).
  4. Проверьте размер очереди отправки для каждого потребителя. Проверьте предварительную выборку каждого потребителя, а затем сравните размер очереди отправки с предварительной выборкой, см.
  5. Есть ли JMSXGroupID, который вы выделяете для каждого сообщения?

Можете ли вы рассказать немного больше о ваших конфигурациях потребителя / производителя / брокера?