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>

最新の依存関係はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22javax%22%20AND%20a%3A%22javaee-api%22[Maven Repository]にあります。この依存関係により、コンパイル時にすべてのJava EE 7 APIが使用可能になります。

provided

スコープは、一度デプロイされたことを確認します。依存関係は、配置されたコンテナによって提供されます。


3ステートレスBean

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

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


3.1ステートレスBeanの作成

まず、

StatelessEJB

Beanを作成しましょう。ステートレスとしてBeanをマークするために

@ Stateless

アノテーションを使います。

@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クライアントを単体テストに投入します。

次に、最初のテスト方法で、

EJBClient1

に注入されたEJBの

name

変数を

Client 1の値に設定します。これで、両方のクライアントの

name__変数の値を比較すると、値が等しい。 ** これは、ステートレス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

クライアントを介して設定され、

ejbClient2

を介して設定された

name

の値が異なっていても維持されることがわかります。これはEJBの状態が維持されていることを示しています。


5ステートレスセッションBeanとステートフルセッションBean

それでは、2種類のセッションBeanの主な違いを見てみましょう。


5.1ステートレスBean

  • ステートレスセッションBeanは、クライアントとの間で状態を維持しません。このため

理由は、それらが相互作用するオブジェクトのプールを作成するために使用することができます
複数のクライアント
** ステートレスBeanはクライアントごとにステートを持たないため、優れています。

パフォーマンスの面で
** 複数のクライアントからの複数のリクエストを並行して処理できます。

そして
** データベースからオブジェクトを取得するために使用できます


5.2ステートフルBean

  • ステートフルセッションBeanは複数のクライアントとの間で状態を維持できます。

タスクはクライアント間で共有されません
** 状態はセッションの間持続します。セッション終了後

破壊された、状態は保持されません
** コンテナは状態を古い状態としてシリアル化して保存する

将来の使用これは、アプリケーションサーバーのリソースを節約し、
Beanの失敗をサポートし、パッシベーションです
** 生産者 – 消費者タイプの問題を解決するために使用できる


6. 結論

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

いつものように、この記事のhttps://github.com/eugenp/tutorials/tree/master/spring-ejb[source]コードはGitHubにあります。