3

ActiveMQ でパフォーマンス テストを実装しようとしているので、基本的なプロデューサーとコンシューマーをセットアップして、キューを介してメッセージを送受信します。問題なくプロデューサーを作成し、特定の数のメッセージをキューに書き込むようにしました。

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

これは問題なく完了し続けており、正しい数の保留中のメッセージがある管理者 Web サイトのチェックでこれを確認しました。

キューからメッセージを受信しようとすると、問題が発生します。単純なコンシューマーを使用してキューから読み取ると、キューからさまざまな数のメッセージが読み取られますが、メッセージの 1 つを受信しようとすると停止します。読み取るメッセージがまだキューにあることがわかりますが、クライアントはメッセージの 1 つを通過しません。メッセージを受信するための簡単な方法を使用しています。

Message message = jmsTemplate.receive();

一部のメッセージ(約20〜30)で機能しますが、ロックするだけです。メッセージ内の文字の一部がエスケープ文字である可能性があることが示唆されました (これはパフォーマンス テストであり、実際にはコンテンツを送信していないため、さまざまな長さのランダムな文字列を使用していました)。すべてのメッセージを変更しました。これは、文字「2」の繰り返しであり、まだ運がありません。ActiveMQ キューにアクセスするために必要なすべてのコンポーネントをロードするために Spring 構成を使用しており、キューはローカルホストで実行されています。

4

2 に答える 2

4

これについてはまだ多くの見解はありませんが、誰かが同じ問題を抱えている場合の将来の参考のために、私は解決策を見つけました。activeMQの構成は、送信者と受信者が速度を落とす前に使用するメモリの量を制限します。私に与えられたデフォルト値は次のとおりです。

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

この構成を完全に削除しましたが、今では夢のように機能します。私はパフォーマンステストを行っているので、あなた自身の制約を入れたいと思うかもしれませんが、これは間違いなく私の問題の原因でした!

于 2008-11-24T17:33:19.210 に答える
0

メッセージングの古典的な問題です。遅い消費者をどうするか。FWIW 5.2 などの最近の ActiveMQ リリースでは、メモリが少なくなったときにプロデューサーをブロックするのではなく、ディスクにスプールできます。

于 2008-11-26T09:47:12.223 に答える