Java EEセッションBean
1. 前書き
エンタープライズセッションBeanは、次のように大きく分類できます。
-
ステートレスセッションBean
-
ステートフルセッションBean
この簡単な記事では、これら2つの主要なタイプのセッションBeanについて説明します。
2. セットアップ
Enterprise Beans 3.2,を使用するには、pom.xmlファイルのdependenciesセクションに最新バージョンを追加してください。
javax
javaee-api
7.0
provided
最新の依存関係はMaven Repositoryにあります。 この依存関係により、コンパイル時にすべてのJava EE 7 APIが使用可能になります。 providedスコープは、一度デプロイされることを保証します。依存関係は、デプロイされたコンテナーによって提供されます。
3. ステートレスBean
ステートレスセッションBeanは、独立した操作を行うために一般的に使用されるエンタープライズBeanの一種です。 クライアントの状態は関連付けられていませんが、インスタンスの状態を保持できます。
ステートレスBeanがどのように機能するかを示す例を見てみましょう。
3.1 Creating the Stateless 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 Testing the Stateless 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の値を比較します。両方のクライアントの変数で、値が等しいことを確認する必要があります。 This shows that state is not preserved in stateless beans。
これが別の方法で真実であることを示しましょう。 2番目のテスト方法では、2番目のクライアントでname変数を設定すると、ejbClient1を介して与えられた値がすべて「上書き」されることがわかります。
4. ステートフルビーンズ
ステートフルセッションBeanは、トランザクション内およびトランザクション間で状態を維持します。 これが、各ステートフルセッションBeanが特定のクライアントに関連付けられている理由です。 コンテナは、ステートフルセッションBeanのインスタンスプールを管理しながら、Beanの状態を自動的に保存および取得できます。
4.1 Creating the Stateful Bean
ステートフルセッションBeanは、@Statefulアノテーションでマークされます。 ステートフルBeanのコードは次のとおりです。
@Stateful
public class StatefulEJB {
public String name;
}
ステートフルBeanの最初のローカルクライアントは次のように記述されます。
public class EJBClient1 {
@EJB
public StatefulEJB statefulEJB;
}
EJBClient1と同じように、EJBClient2という2番目のクライアントも作成されます。
public class EJBClient2 {
@EJB
public StatefulEJB statefulEJB;
}
4.2 Testing the Stateful 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を介して設定されても維持されていることがわかります。違います。 This demonstrates that the state of the EJB is maintained。
5. ステートレスvs. ステートフルセッションBean
次に、2種類のセッションBeanの主な違いを見てみましょう。
5.1 Stateless Beans
-
ステートレスセッションBeanは、クライアントとの状態を維持しません。 このため、複数のクライアントと対話するオブジェクトのプールを作成するために使用できます
-
ステートレスBeanにはクライアントごとの状態がないため、パフォーマンスの面で優れています
-
複数のクライアントからの複数のリクエストを並行して処理できます。
-
データベースからオブジェクトを取得するために使用できます
5.2 Stateful Beans
-
ステートフルセッションBeanは複数のクライアントで状態を維持でき、タスクはクライアント間で共有されません
-
状態はセッションの間持続します。 セッションが破棄された後、状態は保持されません
-
コンテナは、将来の使用に備えて、状態をシリアル化して古い状態として保存できます。 これは、アプリケーションサーバーのリソースを節約し、Beanの障害をサポートするために行われます。
-
生産者と消費者のタイプの問題を解決するために使用できます
6. 結論
したがって、2つのタイプのセッションBeanと、Beanからメソッドを呼び出す対応するクライアントを作成しました。 このプロジェクトは、2つの主要なタイプのセッションBeanの動作を示しています。
いつものように、記事のsourceコードはGitHubで入手できます。