次の構成で ActiveMQ 5.6 を使用しています: - フロー制御オン - トピックのメモリ制限 1MB - ミラー キューが有効 (明示的な仮想トピックは定義されていません)
キューに送信される持続メッセージがありますQueueA
。Mirror.QueueA
明らかに、このメッセージは非永続的で自動的に作成されたトピックにコピーされます。
このトピックには、消費者はいません。ときどきコンシューマーがいる場合、それらは非永続サブスクライバーです。
しばらくすると、プロデューサーがブロックされ、次のエラーが発生します。
Usage Manager memory limit reached for topic://Mirror.QueueA
ActiveMQのドキュメントを含むさまざまな情報源によると、永続的なサブスクライバーのないトピックのメッセージは破棄されます。これは私が望んでいることであり、期待していたことです。しかし、これは明らかにそうではありません。
関連する StackOverflow の質問が 1 つありますが、承認された解決策では、フロー制御を使用し、ディスク スプーリングを無効にすることが提案されています。
これはディスクを使用せず、memoryLimit に達したときにプロデューサをブロックします。
しかし、コンシューマーが来ないために無期限にブロックされるため、プロデューサーをブロックしたくありません。これらのメッセージが保持されているのはなぜですか?
いくつかのオプションが表示されます: - これはバグであり、おそらく今後の AMQ バージョンで修正されます - この構成の問題 (解決方法はわかりません)ヒットしました(そのようなオプションが見つかりませんでした)
誰かが助けてくれることを願っています!
ありがとう、
//J
[アップデート]
すでに 5.6 のバージョンをフィールドに展開していますが、現在、同じ構成の AMQ の 5.8 インストールで同じ耐久性/負荷テストを実行しています。現在、5.6 システムの 10 倍のメッセージを問題なく送信しています。このテストを一晩中、または次の日に実行して、他に制限があるかどうかを確認します.