首先,我是 JMS 和 ActiveMQ 的新手。
我一直在研究一种消息传递解决方案,作为消息生产者的中间件,该消息生产者将通过 HTTP POST 将 XML 消息插入队列。生产者是用 C++ 编写的现有系统,无法修改(因此 Java 和 C++ API 已出局)。
使用“演示”示例和一些试验和错误,我拼凑了一个我想要做的工作示例(在 Windows 框中)。
我在“webapps”下的测试目录中配置的 web.xml 指定从生产者接收到的 HTTP POST 消息将由 MessageServlet 处理。
我在“activemq.xml”中为文本应用添加了一行(“ow”是测试应用目录):
我创建了一个测试脚本来将消息“插入”到运行良好的队列中。
我遇到的问题是,当我继续通过 REST/HTTP POST 插入消息时,ActiveMQ 使用的内存消耗和线程数继续增加(当我有及时的消费者以及缓慢或不存在的消费者时会发生这种情况)。
当内存消耗达到 250MB 左右并且线程数超过 5000(如 Windows 任务管理器中所示)时,ActiveMQ 崩溃,我在日志中看到:
线程“ActiveMQ Transport Initiator: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()