2011-08-05 22 views
2

トピックとセレクタに関する助けが必要です。activemq、jmsトピックとセレクタを持つサブスクライバ

複数の恒久サブスクライバ(セレクタを持つ)を持つトピックのシナリオがあります。 セレクタが一致しないため、トピックに入るメッセージのすべてがコンシューマによって読み取られるわけではありません。

これは正しい動作です。

しかし、この時点で他のメッセージはコンシューマに配信されていないため、不一致のメッセージが特定の数量のしきい値に達したときに問題が発生します。 activemqはこれらの古い一致しないメッセージをディスパッチしようとしますが、誰でも助けてくれますか?

私のセットアップは、ActiveMQの5.5

は、いくつかの設定オプションがある、またはそれだけで欠陥設計であるのですか?

答えて

3

これは、ActiveMQの方が優れた選択肢とバグかもしれないので、これは欠陥のあるデザインだと思います。

最初の質問:このトピックに公開しているプロデューサは、これらのメッセージにJMSExpirationヘッダーを設定していますか?

「はい」の場合は、先に説明したシナリオを詳しく説明するcreate a Jira issueがあります。セレクタが適用されないメッセージの送信をActiveMQが続行し続けることは間違っているためです。

欠陥のあるデザインでは、「自分が永続的な加入者が必要です」という声が聞こえ、ActiveMQを使用している場合は、すぐに代わりに仮想の宛先を使用する必要があります。仮想宛先には、プロデューサが宛先にメッセージを送信し、そのメッセージをN個の他の宛先に伝播させて消費することができるという点でトピックの利点がありますが、トピックで永続的なサブスクライバを使用することに伴う欠点はありません。 Virtual Destinations hereについてもっと読む。

1

これはバグのようです(または少なくとも大変不便ですが)Virtual Destinationsを使用して回避策があります。

引用:

注意トピックは、仮想作ること がトピックにメッセージを送信するとき、小さなCPUのオーバーヘッドを追加しませんが、それはかなり小さいこと。バージョン 5.4から、バーチャルトピックからサブスクリプションキューへのディスパッチは、既存の サブスクライバの1つに一致するメッセージのみが実際にディスパッチされるように、 selectorAwareにすることができます。このオプションを使用すると、コンシューマ のコンシューマによってセレクタが使用されているときに一致しないメッセージが生成されることがありません。

2

これは、ActiveMQがスパースセレクタを処理する方法に関連しています。現在の実装では、メッセージマッチングの希薄セレクタを探すためにストアにページングしませんので、これを試して回避するためにいくつかの設定を変更する必要があります。設定された宛先ポリシーにmaxBrowsePageSizeを設定できます。デフォルト値は400です。pageを参照してください。

ActiveMQの仮想的な宛先がおそらくより良い選択肢です。ほとんどの場合、恒久サブスクライバを使用することを考えています。ただし、メッセージの有効期限をメッセージに追加して、ActiveMQ 5.6のSNAPSHOTバージョンを使用する場合は、非アクティブな永続サブスクライバでメッセージを期限切れにするようにポリシーを構成することができます。

関連する問題