22.2. EJB 3.0 でのステートフルセッション Bean

ステートフルセッション Bean のクラスター化は、JBoss がステート情報を管理する必要があるためステートレスセッション beanよりも複雑になります。すべてのステートフルセッション Bean のステートはレプリケートされ、Bean のステートが変更されるたびにクラスター全体で同期されます。

22.2.1. EJB アプリケーション設定

EJB 3.0 でステートフルセッション Bean をクラスター化するには、 EJB 3.0 のステートレスセッション Bean をクラスター化したように、 Bean 実装クラスに @Cluster アノテーションのタグを付ける必要があります。 ステートレスセッション Bean と異なり、 ステートフルセッション Bean のメソッド呼び出しは、 デフォルトで org.jboss.ha.client.loadbalance.aop.FirstAvailable を使用して負荷分散されます。 このポリシーを使用してメソッド呼び出しが無作為に選択されたノードに従います。
@org.jboss.ejb3.annotation.CacheConfig アノテーションを Bean に適応してデフォルトのキャッシング動作を上書きすることもできます。 @CacheConfig アノテーションの定義は次の通りです。
public @interface CacheConfig
{
   String name() default "";
   int maxSize() default 10000;
   long idleTimeoutSeconds() default 300;   
   boolean replicationIsPassivation() default true;   
   long removalTimeoutSeconds() default 0;
}
  • name は、 「CacheManager サービスの設定」 で説明した CacheManager サービスで登録されたキャッシュ設定の名前を指定します。 デフォルトでは、 sfsb-cache 設定が使用されます。
  • maxSize は、LRU アルゴリズムを使用して Bean の非活性化を開始する前にキャッシュできる Bean の最大数を指定します。
  • idleTimeoutSeconds はキャッシュが Bean を非活性化する前に Bean が未使用の状態でいられる最大時間を指定します (maxSize Bean がキャッシュされているかは無関係)。
  • removalTimeoutSeconds は、キャッシュが Bean を削除するまで Bean を使用しない最大時間を指定します。
  • replicationIsPassivation は、キャッシュでレプリケーションを非活性化と同等であると見なし、Bean に対して @PrePassivate と @PostActivate のコールバックを呼び出すかどうかを指定します。デフォルトでは真であり、レプリケーションには Bean のシリアル化が関係するため、シリアル化の準備とシリアル化からの回復がコールバックメソッドを実装する一般的な理由となります。
以下は、クラスター化された EJB 3.0 のステートレスセッション Bean の実装例になります。
@Stateful
@Clustered
@CacheConfig(maxSize=5000, removalTimeoutSeconds=18000)
public class MyBean implements MySessionInt
{
   private int state = 0;

   public void increment()
   {
      System.out.println("counter: " + (state++));
   }
}
ステートレス Bean と同様に、@Clustered アノテーションは省略でき、クラスタリング設定は jboss.xml に適用されます。
<jboss>    
   <enterprise-beans>
      <session>
         <ejb-name>NonAnnotationStateful</ejb-name>
         <clustered>true</clustered>
         <cache-config>
            <cache-max-size>5000</cache-max-size>
            <remove-timeout-seconds>18000</remove-timeout-seconds>
         </cache-config>
      </session>    
   </enterprise-beans>
</jboss>