2017-05-02 30 views
1

単一のキューをリッスンする複数のMDBリスナーを実装する必要があります。キューの負荷が増加すると、1つのリスナーではその負荷を処理するには十分ではありません。私たちがこれを達成するためにできる最善の方法を知りたいですか?複数のMDBリスナーが同じキューで読み取る

a。同様のMDBクラスを作成してwebsphereサーバーにデプロイできます。 b。任意の設定を使用する他の方法ですか?

リスナーを動的に構成し、必要に応じて有効にしたり、これを達成するために1つの方法ポイント(a)しかないような正しいアプローチをしてください。

答えて

0

重要な点はありません。これは、クライアントの要求を処理するために1つ以上のBeanをインスタンス化するコンテナです。エンタープライズBeanの全世界には、スケーラビリティが重要なポイントです。

基本的には、Beanを設計して配備する以外に何もする必要はありません。コンテナは残りの作業を行います。

0

@MessageDriven注釈を使用してJEE仕様で定義されているMDBを使用している場合、これらのBeanの実際のインスタンス化とスケーリングを管理するのはサーバーコンテナです。私はWebsphereに精通しているわけではありませんが、ほとんどのサーバーはEJBプーリングという概念を持っています。これはスレッドプールに大まかに変換され、並列実行をすぐに実行できます。このようにして、サーバーにはキュー内のメッセージを処理する準備ができている一連のインスタンスがあります。各Beanインスタンスは、onMessageメソッドを実行するのに必要な時間だけアクティブになり、その後、そのインスタンスはクリーンアップされ、キューに戻されます。したがって、MDBプールのサイズが20であるとしましょう。キューに20を超えるメッセージが待機している場合、サーバーは使用可能なインスタンスをすべて使い切り、同時にメッセージを処理します。
たとえば、Wildfly/JBossでは、EJBサブシステムと対応するプール設定を使用してEJBプールを管理します。ここで

<subsystem xmlns="urn:jboss:domain:ejb3:4.0"> 
    <!--omitted for brevity... --> 
    <mdb> 
     <resource-adapter-ref resource-adapter-name="${ejb.resource-adapter-name:activemq-ra.rar}"/> 
     <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/> 
    </mdb> 
    <pools> 
     <bean-instance-pools> 
      <strict-max-pool name="mdb-strict-max-pool" derive-size="from-cpu-count" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> 
     </bean-instance-pools> 
    </pools> 
    <!--omitted for brevity... --> 

我々はそのメッセージ駆動型Beanは、我々のシステム上のCPUの数からそのサイズを導出mdb-strict-max-poolという名前のプールを使用する必要があり、指定します。絶対値を指定することもできます(例: max-pool-size="20"

これは、単一のサーバーインスタンスでキューを実行している場合にのみ関係します。メッセージ集中型のアプリケーションを実際に実行している場合は、専用のメッセージブローカーと複数の処理インスタンスを使用して分散型メッセージングが必要になる可能性があります。多くのサーバーがこのようなシナリオ(Wildfly ActiveMQクラスタなど)をサポートしていますが、実際には別の話題のトピックです。

詳細については、MDB tutorialとご使用のサーバーのマニュアルを参照してください。
ハッピーハッキング。

関連する問題