Клиент Java ActiveMQ не может получать сообщения

StackOverflow https://stackoverflow.com/questions/314765

  •  10-07-2019
  •  | 
  •  

Вопрос

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

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

Это продолжается до завершения без проблем, и я подтвердил это проверками на веб-сайте администратора, которые имеют правильное количество ожидающих сообщений.

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

Message message = jmsTemplate.receive();

и он работает для некоторых сообщений (около 20-30), но затем просто блокируется. Мне было предложено, чтобы некоторые символы в сообщении могли быть escape-символами (я использовал произвольную строку различной длины, потому что это просто тест производительности, а не отправлял какой-либо контент), поэтому я изменил все сообщения к той же строке, которая является повторением символа '2' и до сих пор не повезло. Я использую конфигурацию Spring для загрузки всех компонентов, необходимых для доступа к очереди ActiveMQ, и очередь работает на моем локальном хосте.

Это было полезно?

Решение

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

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

Я полностью удалил эту конфигурацию, и теперь она работает как мечта. Я провожу тестирование производительности, поэтому вы можете захотеть установить свои собственные ограничения, но это определенно стало причиной моих проблем!

Другие советы

Это классическая проблема с обменом сообщениями; что делать с медленными потребителями. FWIW - более новые выпуски ActiveMQ, такие как 5.2, позволяют буферизовать на диск, а не блокировать производителей, когда объем памяти уменьшается

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top