ActiveMQ 5.2.0 + REST + HTTP POST = java.lang.OutOfMemoryError - PullRequest
4 голосов
/ 01 мая 2009

Прежде всего, я новичок, когда дело доходит до JMS & ActiveMQ.

Я искал решение для обмена сообщениями, которое будет служить промежуточным программным обеспечением для производителя сообщений, который будет вставлять XML-сообщения в очередь через HTTP POST. Производителем является существующая система, написанная на C ++, которая не может быть изменена (поэтому Java и C ++ API отсутствуют).

Используя примеры "demo" и некоторые методики проб и ошибок, я собрал рабочий пример того, что я хочу сделать (в окне Windows).

Файл web.xml, который я настроил в тестовой директории в разделе «webapps», указывает, что сообщения HTTP POST, полученные от производителя, должны обрабатываться MessageServlet.

Я добавил строку для текстового приложения в «activemq.xml» («ow» - это каталог тестового приложения):

Я создал тестовый скрипт для «вставки» сообщений в очередь, который хорошо работает.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я продолжаю вставлять сообщения через REST / HTTP POST, потребление памяти и число потоков, используемых ActiveMQ, продолжают расти (это происходит, когда у меня есть своевременные потребители, а также -существующие потребители).

Когда потребление памяти достигает 250 МБ, а число потоков превышает 5000 (как показано в диспетчере задач Windows), происходит сбой ActiveMQ, и я вижу это в журнале:

Исключение в потоке "Инициатор транспорта ActiveMQ: vm: // localhost # 3564" java.lang.OutOfMemoryError: невозможно создать новый собственный поток

Как будто Jetty создает новый поток для обработки каждого HTTP POST, и поток никогда не умирает.

Я посмотрел на этой странице:

http://activemq.apache.org/javalangoutofmemory.html

и пытался, но это не решило проблему (хотя я не до конца понимал последствия изменений).

У кого-нибудь есть идеи?

Спасибо!

  • Брюс Лот

PS - я включил ниже скрипт Python "производитель тестового сообщения", чтобы он того стоил. Я создал пакеты из 100 сообщений и продолжал запускать скрипт вручную из командной строки, наблюдая за потреблением памяти и количеством потоков ActiveMQ в диспетчере задач.

def foo():
    import httplib, urllib

    body = "<?xml version='1.0' encoding='UTF-8'?>\n \
    <ROOT>\n \
        [snip: xml deleted to save space]
    </ROOT>"

    headers = {"content-type": "text/xml",
               "content-length": str(len(body))}

    conn = httplib.HTTPConnection("127.0.0.1:8161")
    conn.request("POST", "/ow/message/RDRCP_Inbox?type=queue", body, headers)
    response = conn.getresponse()
    print response.status, response.reason
    data = response.read()
    conn.close()
## end method definition


## Begin test code
count = 0;

while(count < 100):
    # Test with batches of 100 msgs
    count += 1
    foo()

Ответы [ 2 ]

2 голосов
/ 13 ноября 2009

Ошибка вызвана не непосредственно ActiveMQ, а средой выполнения Java. Посмотрите здесь:

http://activemq.apache.org/javalangoutofmemory.html

как вы можете использовать память для Java HEAP. Существует также интересная информация о том, ПОЧЕМУ это происходит и что вы можете сделать, чтобы предотвратить это. ActiveMQ довольно хорош, но нуждается в некоторой настройке здесь и там в файлах конфигурации.

0 голосов
/ 25 августа 2016

Вы можете добавить следующее в строку запроса URL:
JMSDeliveryMode=persistent

В противном случае по определению (читается «по умолчанию») сообщения будут храниться в памяти AMQ.

...