Java ActiveMQクライアントがメッセージを受信できない
質問
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リリースでは、メモリが少なくなったときにプロデューサーをブロックするのではなく、ディスクにスプールできます