3

ActiveMQメッセージブローカーの単一のトピックのコンシューマーとサブスクライバーの両方であるクライアントがいくつかあります。すべてのクライアントは同じコードを共有します。実際には、(1)メッセージを生成するEJB、および(2)メッセージを消費するMDBで構成されるまったく同じエンタープライズアプリケーションを使用しています。

問題は、基本的に、クライアントA、B、およびCがあり、Aがメッセージを送信した場合、A、B、Cがすべてメッセージを受信することです。Aに独自のメッセージを受信させたくありません。

そこで、さまざまな解決策を試してみました。思いついた最善の解決策は、送信メッセージに文字列プロパティを設定することでした(例:source = myVeryOwnID)次に、MDBで、 source<>'myVeryOwnID'のようなメッセージセレクターを設定します。

残念ながら、このIDをソースコード(私の場合は注釈内)に設定する必要があるため、これは不十分な解決策です。つまり、新しいクライアントをデプロイするときに、.EARファイルを誰かに渡すことはできません。代わりに、一意の「ソース」プロパティを使用して特別に再コンパイルする必要があります。

理想的には、MACアドレスをIDとして使用するか、Glassfish内で設定されたIDを使用したいと思います(私はGFv3を使用しています)。

どんな解決策やアイデアも大歓迎です!

4

3 に答える 3

2

メッセージで「ソース」メッセージ属性を使用し、メッセージセレクターを使用するのが私見です。これをMDBに(アノテーションで)ハードコーディングしたくない場合は、デプロイメント記述子を使用して、パッケージ化時にメッセージセレクターを設定します。

于 2010-02-22T08:38:03.293 に答える
1

ActiveMQには、この状況に正確に対処するためのメソッド引数が含まれています。ActiveMQSession.createConsumer()メソッドとメソッドの両方がActiveMQSession. createDurableSubscriber()、という名前の引数を受け入れるバリアントを提供しますnoLocalnoLocal同じ接続でローカルに公開されたメッセージを受信しないようにするには、引数をtrueに設定します。

ブルース

于 2010-03-03T16:50:16.420 に答える
0

昔ながらのSystem.GetProperty()および-Dオプションはどうですか?一意のアプリケーションIDをシステムプロパティとして設定できます。

-Dmyapp.id=A

たとえば、Tomcatでは、JAVA_OPTS変数を介してシステムプロパティを渡すことができます。

export JAVA_OPTS='-Dmyapp.id=A'

次に、アプリケーションでそれを読むことができます:

String appId = System.getProperty("myapp.id")

各アプリケーションサーバーのシステム変数を設定するために必要なことはすべてです。

于 2010-02-28T12:16:07.597 に答える