質問

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);
                }
            }

これは問題なく完了し続けており、管理ウェブサイトで確認し、保留中のメッセージの正しい数を確認しています。

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

Message message = jmsTemplate.receive();

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

役に立ちましたか?

解決

これについてはまだ多くの意見はありませんが、将来同じ参照をする人がいる場合は、解決策を見つけました。 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>

この構成を完全に削除しましたが、今では夢のように機能します。パフォーマンステストを実施しているため、独自の制約を設定することもできますが、これが間違いなく私の問題の原因でした!

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top