Java EEセッションBean
1前書き
エンタープライズセッションBeanは、大きく次のように分類できます。
-
ステートレスセッションBean
-
ステートフルセッション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にあります。