Прежде всего, я новичок, когда дело доходит до 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()