私は このチュートリアル もEJBを使用しています:
package exercise1;
import Java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;
@Stateless
public class MessageServerBean {
private int counter = 0;
public String getMessage(){
Random random = new Random();
random.nextInt(9999999);
int myRandomNumber = random.nextInt();
return "" + myRandomNumber;
}
public int getCounter(){
return counter++;
}
}
出力例を次に示します。
Faceletsからこんにちは
メッセージ:84804258
カウンターは:26
Message Server Bean:Exercise1.MessageServerBean@757b6193
これが私の観察です:
@Stateless
として設定すると、常に同じオブジェクトIDを取得し、カウンターは常に増分します。@Stateful
として設定すると、ページを更新するたびに新しいインスタンスが取得されます。@Singleton
に設定すると、@Stateless
に設定した場合と同じ結果が得られます。同じオブジェクトID、カウンターの増分。それで、私が実際に理解したいのは、この場合の@Stateless
と@Singleton
EJBの違いは何ですか?
一度にEJBにアクセスするクライアントは1つだけなので、同じ出力が表示されます。アプリケーションサーバーは、呼び出しごとに同じステートレスEJBオブジェクトをリサイクルできます。同時に複数のクライアントにアクセスしようとすると、新しいステートレスインスタンスが表示されます。
サーバーの負荷に応じて、同じクライアントによる2回の連続したメソッド呼び出しでさえ、異なるステートレスEJBオブジェクトになる可能性があることに注意してください!
シングルトンEJBの場合、違いはありません。アプリケーションにアクセスしようとするクライアントの数に関係なく、アプリケーションごとに常に1つのインスタンスしかありません。
シングルトンセッションBeanは、ステートレスセッションBeanと同様の機能を提供しますが、ステートレスセッションBeanのプールとは対照的に、アプリケーションごとにシングルトンセッションBeanが1つしかない点が異なります。ステートレスセッションBeanと同様に、シングルトンセッションBeanはWebサービスエンドポイントを実装できます。
シングルトン 不動態化することはできません:
ステートレスセッションBeanのように、シングルトンセッションBeanは決して非活性化されず、存在しないビジネスメソッドの呼び出しの準備ができている2つの段階しかありません(...)
ドキュメントでは 各種類のBeanをいつ使用するか について説明しており、シングルトンBeanには次のものがあります。
単一のエンタープライズBeanは、複数のスレッドから同時にアクセスする必要があります。
アプリケーションには、アプリケーションの起動およびシャットダウン時にタスクを実行するエンタープライズBeanが必要です。
したがって、あなたの例では、2つのアノテーションに違いはありません。