第5章 EJB サブシステムの調整
JBoss EAP は Enterprise Java Bean (EJB) をキャッシュし、初期化時間を節約できます。これは、bean プールを使用して行います。
JBoss EAP では、bean インスタンスプール と bean スレッドプール の 2 種類の bean プールを調整できます。
適切な bean プールサイズは、ご使用の環境とアプリケーションによって異なります。予想される実際の条件を模倣する開発環境で、さまざまな bean プールサイズを試し、ストレステストを実行することが推奨されます。
5.1. Bean インスタンスプール
bean インスタンスプールは、ステートレスセッション bean (SLSB) およびメッセージ駆動型 bean (MDB) に使用されます。デフォルトでは、SLSB はインスタンスプールの default-slsb-instance-pool
を使用し、MDB はインスタンスプールの default-mdb-instance-pool
を使用します。
bean インスタンスプールのサイズによって、一度に作成可能な特定の EJB のインスタンス数が制限されます。特定の EJB の空きがない場合、クライアントはインスタンスが利用可能になるまでブロックおよび待機します。プールの timeout
属性に設定された時間内にクライアントがインスタンスを取得できないと、例外が発生します。
bean インスタンスプールのサイズは、derive-size
または max-pool-size
のいずれかを使用して設定されます。derive-size
属性を使用する場合、以下の値の 1 つを使用してプールサイズを設定できます。
-
from-worker-pools
: 最大プールサイズはシステム上で設定されたワーカープールすべての合計スレッドのサイズから派生することを意味します。 -
from-cpu-count
: 最大プールサイズはシステム上で利用可能なプロセッサーの合計数から派生することを意味します。
derive-size
が未定義の場合、max-pool-size
の値が bean インスタンスプールのサイズに使用されます。
derive-size
属性は、max-pool-size
に指定された値をすべてオーバーライドします。max-pool-size
の値を反映するには、derive-size
を未定義にする必要があります。
特定のインスタンスプールを使用するよう EJB を設定することができます。これにより、各 EJB タイプが使用できるインスタンスをより細かく制御できます。
5.1.1. Bean インスタンスプールの作成
ここでは、管理 CLI を使用して新たに bean インスタンスプールを作成する方法を説明します。また、管理コンソールを使用して bean インスタンスプールを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを選択し、Bean Pools タブを選択します。
新しいインスタンスプールを作成するには、以下のコマンドの 1 つを使用します。
派生した最大プールサイズで bean インスタンスプールを作成する場合:
/subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(derive-size=DERIVE_OPTION,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)
以下の例は、CPU 数から派生した最大サイズと、2 分のタイムアウトを指定して、
my_derived_pool
という名前の bean インスタンスプールを作成します。/subsystem=ejb3/strict-max-bean-instance-pool=my_derived_pool:add(derive-size=from-cpu-count,timeout-unit=MINUTES,timeout=2)
明示的な最大プールサイズで bean インスタンスプールを作成する場合:
/subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(max-pool-size=POOL_SIZE,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)
以下の例は、30 個の最大インスタンスと、30 秒のタイムアウトを指定して、
my_pool
という名前の bean インスタンスプールを作成します。/subsystem=ejb3/strict-max-bean-instance-pool=my_pool:add(max-pool-size=30,timeout-unit=SECONDS,timeout=30)
5.1.2. Bean が使用するインスタンスプールの指定
特定の bean が使用する特定のインスタンスプールを設定するには、@org.jboss.ejb3.annotation.Pool
アノテーションを使用するか、bean の jboss-ejb3.xml
デプロイメント記述子を編集します。詳細は、『Developing EJB Applications』の「jboss-ejb3.xml
Deployment Descriptor Reference」を参照してください。
5.1.3. デフォルト Bean インスタンスプールの無効化
デフォルトの bean インスタンスプールは無効にすることができます。無効にすると、EJB はデフォルトでインスタンスプールを何も使用しません。代わりに、スレッドが EJB でメソッドを呼び出す必要があるときに新しい EJB インスタンスが作成されます。これは、作成された EJB インスタンスの数を制限したい場合に便利です。
デフォルトの beanインスタンスプールを無効にするには、以下の管理 CLI コマンドを使用します。
/subsystem=ejb3:undefine-attribute(name=default-slsb-instance-pool)
bean が 特定の bean インスタンスプールを使用するよう設定されている場合、デフォルトのインスタンスプールを無効にしても、bean が使用するプールは影響を受けません。
5.2. Bean スレッドプール
デフォルトでは、default
という名前の bean スレッドプールは非同期 EJB 呼び出しと EJB タイマーに使用されます。
JBoss EAP 7 以降のリリースでは、リモート EJB リクエストはデフォルトで io
サブシステムに定義されたワーカーで処理されます。
必要な場合は、各 EJB サービスが異なる bean スレッドプールを使用するよう設定することができます。これは、各サービスによる bean スレッドプールへのアクセスをより細かく制御する場合に便利です。
適切なスレッドプールサイズを判断するとき、想定される同時リクエストが 1 度に処理される数を考慮してください。
5.2.1. Bean スレッドプールの作成
ここでは、管理 CLI を使用して新たに bean スレッドプールを作成する方法を説明します。また、管理コンソールを使用して bean スレッドプールを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを選択し、左側のメニューにある Thread Pools を選択します。
新しいスレッドプールを作成するには、以下のコマンドを使用します。
/subsystem=ejb3/thread-pool=POOL_NAME:add(max-threads=MAX_THREADS)
以下の例は、最大 30 個のスレッドを持つ my_thread_pool
という名前の bean スレッドプールを作成します。
/subsystem=ejb3/thread-pool=my_thread_pool:add(max-threads=30)
5.2.2. 特定の Bean スレッドプールを使用するよう EJB サービスを設定
特定の bean スレッドプールを使用するよう、EJB3 非同期呼び出しサービスおよびタイマーサービスをそれぞれ設定することができます。デフォルトでは、これらのサービスは default
bean スレッドプールを使用します。
ここでは、管理 CLI を使用して、特定の beanスレッドプールを使用するよう上記の EJB サービスを設定する方法を説明します。また、管理コンソールを使用してこれらのサービスを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを指定し、Services タブを選択します。
特定の bean スレッドプールを使用するよう EJB サービスを設定するには、以下のコマンドを使用します。
/subsystem=ejb3/service=SERVICE_NAME:write-attribute(name=thread-pool-name,value=THREAD_POOL_NAME)
SERVICE_NAME
は、以下のように設定する EJB サービスに置き換えてください。
-
EJB3 非同期呼び出しサービスの場合は
async
-
EJB3 タイマーサービスの場合は
timer-service
以下の例は、my_thread_pool
という名前の bean スレッドプールを使用するよう EJB3 非同期サービスを設定します。
/subsystem=ejb3/service=async:write-attribute(name=thread-pool-name,value=my_thread_pool)
5.3. EJB サブシステムの調整の必要性を示す例外
ステートレス EJB インスタンスプールが小さすぎる、またはタイムアウトが短すぎる。
javax.ejb.EJBException: JBAS014516: Failed to acquire a permit within 20 SECONDS at org.jboss.as.ejb3.pool.strictmax.StrictMaxPool.get(StrictMaxPool.java:109)
Bean インスタンスプール を参照してください。
EJB スレッドプールが小さすぎる、または EJB の処理時間が呼び出しタイムアウトよりも長い。
java.util.concurrent.TimeoutException: No invocation response received in 300000 milliseconds
Bean スレッドプール を参照してください。