@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とご使用のサーバーのマニュアルを参照してください。
ハッピーハッキング。