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 に答える