4

首先,我是 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()
4

2 回答 2

2

该错误不是由 ActiveMQ 直接引起的,而是由 Java 运行时引起的。看看这里:

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

如何为 Java HEAP 增加内存。关于为什么会发生这种情况以及您可以采取哪些措施来防止这种情况,还有一些有趣的东西。ActiveMQ 非常好,但需要在配置文件中到处进行一些自定义。

于 2009-11-13T09:14:57.820 回答
0

您可能希望将以下内容添加到 URL 的查询字符串中:
JMSDeliveryMode=persistent

否则,根据定义(阅读“默认情况”),消息将保存在 AMQ 的内存中。

于 2016-08-25T12:49:35.043 回答