首先,我谈到JMS& amp; 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传输启动器: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()
最佳答案 该错误不是由ActiveMQ直接引起的,而是由Java Runtime引起的.看看这里:
http://activemq.apache.org/javalangoutofmemory.html
如何为Java HEAP增加内存.关于为什么会发生这种情况以及您可能采取哪些措施来防止这种情况,也存在着令人兴奋的问题. ActiveMQ非常好,但需要在配置文件中进行一些自定义.