1. 序章

エンタープライズセッションBeanは、大きく次のように分類できます。

  1. ステートレスセッションBean
  2. ステートフルセッションBean

この簡単な記事では、これら2つの主要なタイプのセッションBeanについて説明します。

2. 設定

Enterprise Beans 3.2 を使用するには、pom.xmlファイルのdependenciesセクションに最新バージョンを追加してください。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>
最新の依存関係は、Mavenリポジトリにあります。 この依存関係により、コンパイル時にすべてのJava EE7APIを使用できるようになります。 提供されたスコープは、一度展開されることを保証します。 依存関係は、デプロイされたコンテナーによって提供されます。

3. ステートレスビーンズ

ステートレスセッションBeanは、独立した操作を行うために一般的に使用されるエンタープライズBeanの一種です。 関連付けられたクライアント状態はありませんが、インスタンス状態を保持する場合があります。

ステートレスbeanがどのように機能するかを示す例を見てみましょう。

3.1. ステートレスBeanの作成

まず、 StatelessEJBbeanを作成しましょう。 @Stateless アノテーションを使用して、Beanをステートレスとしてマークします。

@Stateless
public class StatelessEJB {

    public String name;

}

次に、EJBClient1と呼ばれる上記のステートレスBeanの最初のクライアントを作成します。

public class EJBClient1 {

    @EJB
    public StatelessEJB statelessEJB;

}

次に、同じステートレスBeanにアクセスする EJBClient2、という名前の別のクライアントを宣言します。

public class EJBClient2 {

    @EJB
    public StatelessEJB statelessEJB;

}

3.2. ステートレスBeanのテスト

EJBのステートレス性をテストするには、上記で宣言した2つのクライアントを次のように使用できます。

@RunWith(Arquillian.class)
public class StatelessEJBTest {

    @Inject
    private EJBClient1 ejbClient1;

    @Inject
    private EJBClient2 ejbClient2;

    @Test
    public void givenOneStatelessBean_whenStateIsSetInOneBean
      _secondBeanShouldHaveSameState() {

        ejbClient1.statelessEJB.name = "Client 1";
        assertEquals("Client 1", ejbClient1.statelessEJB.name);
        assertEquals("Client 1", ejbClient2.statelessEJB.name);
    }

    @Test
    public void givenOneStatelessBean_whenStateIsSetInBothBeans
      _secondBeanShouldHaveSecondBeanState() {

        ejbClient1.statelessEJB.name = "Client 1";
        ejbClient2.statelessEJB.name = "Client 2";
        assertEquals("Client 2", ejbClient2.statelessEJB.name);
    }

    // Arquillian setup code removed for brevity

}

まず、2つのEBJクライアントを単体テストに挿入します。

次に、最初のテスト方法で、 名前に注入されたEJBの変数 EJBClient1 値にクライアント1。 さて、の値を比較すると名前両方のクライアントで変数であるため、値が等しいことがわかります。 これは、ステートレスBeanで状態が保持されないことを示しています

これが別の方法で真実であることを示しましょう。 2番目のテスト方法では、2番目のクライアントで name 変数を設定すると、ejbClient1を介して与えられた値を「上書き」することがわかります。

4. ステートフルビーンズ

ステートフルセッションBeanは、トランザクション内およびトランザクション間の両方で状態を維持します。 これが、各ステートフルセッションBeanが特定のクライアントに関連付けられている理由です。 コンテナは、ステートフルセッションBeanのインスタンスプールを管理しながら、Beanの状態を自動的に保存および取得できます。

4.1. ステートフルBeanの作成

ステートフルセッションBeanは、@Statefulアノテーションでマークされています。 ステートフルBeanのコードは次のとおりです。

@Stateful
public class StatefulEJB {

    public String name;

}

ステートフルBeanの最初のローカルクライアントは次のように記述されます。

public class EJBClient1 {

    @EJB
    public StatefulEJB statefulEJB;

}

EJBClient2という2番目のクライアントもEJBClient1と同じように作成されます。

public class EJBClient2 {

    @EJB
    public StatefulEJB statefulEJB;

}

4.2. ステートフルBeanのテスト

ステートフルBeanの機能は、EJBStatefulBeanTest単体テストで次の方法でテストされます。

@RunWith(Arquillian.class)
public class StatefulEJBTest {

    @Inject
    private EJBClient1 ejbClient1;

    @Inject
    private EJBClient2 ejbClient2;

    @Test
    public void givenOneStatefulBean_whenTwoClientsSetValueOnBean
      _thenClientStateIsMaintained() {

        ejbClient1.statefulEJB.name = "Client 1";
        ejbClient2.statefulEJB.name = "Client 2";
        assertNotEquals(ejbClient1.statefulEJB.name, ejbClient2.statefulEJB.name);
        assertEquals("Client 1", ejbClient1.statefulEJB.name);
        assertEquals("Client 2", ejbClient2.statefulEJB.name);
    }

    // Arquillian setup code removed for brevity

}

前と同じように、2つのEJBクライアントが単体テストに挿入されます。 テストメソッドでは、name変数の値がejbClient1クライアントを介して設定され、nameの値がを介して設定されても維持されていることがわかります。 ejbClient2は異なります。 これは、EJBの状態が維持されていることを示しています

5. ステートレスvs。 ステートフルセッションBean

次に、2つのタイプのセッションBeanの主な違いを見てみましょう。

5.1. ステートレスビーンズ

  • ステートレスセッションBeanは、クライアントとの状態を維持しません。 このため、これらを使用して、複数のクライアントと対話するオブジェクトのプールを作成できます。
  • ステートレスBeanにはクライアントごとの状態がないため、パフォーマンスの面で優れています。
  • 複数のクライアントからの複数のリクエストを並行して処理でき、
  • データベースからオブジェクトを取得するために使用できます

5.2. ステートフルビーンズ

  • ステートフルセッションBeanは複数のクライアントで状態を維持でき、タスクはクライアント間で共有されません
  • 状態はセッションの間続きます。 セッションが破棄された後、状態は保持されません
  • コンテナは、状態をシリアル化して、将来使用するために古い状態として保存できます。 これは、アプリケーションサーバーのリソースを節約し、Beanの障害をサポートするために行われ、パッシベーションです。
  • 生産者-消費者タイプの問題を解決するために使用できます

6. 結論

そこで、Beanからメソッドを呼び出すために、2種類のセッションBeanと対応するクライアントを作成しました。 このプロジェクトは、2つの主要なタイプのセッションBeanの動作を示しています。

いつものように、記事のsourceコードはGitHubで入手できます。