0

Glassfish 3.1.2を使用しており、1つのノードと2つのインスタンスを持つクラスターをセットアップしました。

クラスターにデプロイしたトピックをサブスクライブするメッセージ駆動型Beanがアプリケーションにあります。

トピックにメッセージを公開するとき、両方のインスタンスがメッセージを受信するようにします。

ただし、実際には、1つのインスタンスのみがメッセージを受信して​​いることがわかりました。

「共有サブスクリプション」と呼ばれる機能に遭遇していると思います http://docs.oracle.com/cd/E18930_01/html/821-2438/gjzpg.html#MQAGgjzpg

この機能(デフォルトで有効になっています)は、同じクライアントIDを持つクラスター内のBeanが共有され、事実上1つのサブスクリプションのみであることを示しています。

デフォルトでは、MDBのクライアントIDはその名前であると表示されます。これは、両方のインスタンスが同じクライアントIDを使用していることを意味します。

したがって、この機能を完全に無効にする以外に、各インスタンスが異なるクライアントIDでサブスクライブするようにMDBをセットアップできるかどうかを知りたいですか?両方のインスタンスが同じWARファイルを使用しているため、これは少し注意が必要です。アノテーションでクライアントIDを設定できると思いますが、実行時に変更できるかどうかはわかりません...

4

1 に答える 1

0

この機能を完全に無効にする理由がわかりません。あなたが提供したリンクでは、これを ActivationSpec/MDB ごとに構成することが明確に述べられています。私が理解している限りでは、手元にある MDB にのみ影響します。

MDB の場合、ActivationSpec プロパティ useSharedSubscriptionInClusteredContainer を false に設定します。これは、MDB 自体またはデプロイメント記述子 ejb-jar.xml または glassfish-ejb-jar.xml で注釈を使用して、他の ActivationSpec プロパティとまったく同じ方法で行います。

もちろん、実行時にクライアント ID を動的に接続に設定することもできます。コンテナによって管理される機能に頼るよりも、おそらく JMS 接続を自分で処理する必要があることに注意してください。

http://docs.oracle.com/javaee/6/api/javax/jms/Connection.html#setClientID(java.lang.String)

于 2013-03-08T07:17:35.007 に答える