2013-04-10 19 views
7

私たちは、ステートレスセッションBeanはいかなる方法でも状態を保持していないことを知っています。それでは、ステートレスセッションBeanにグローバル変数を持つ点は何ですか?仕様でブロックされていない理由(不必要な混乱を避けるため)ステートレスセッションBeanにグローバル変数を設定する際のポイントは何ですか?

グローバル変数を持つことのメリットがある場合は、コード断片を説明してください。

+0

"グローバル変数" を定義します。標準的なJava用語ではなく、異なる人々に異なることを意味するかもしれないので私は尋ねる。 –

答えて

0

明らかに、ステートレスセッションEJBは、は、EJBのメソッド呼び出し間に状態を保持しないようにする必要があります。

EJBのインスタンス変数を禁止することによって強硬なアプローチをとるのではなく、 EJB開発者は中間記憶域のためにそれらを定義することができます。 おそらく中間の値、 があり、内部プライベートメソッドが呼び出されています。 を渡すのではなく、短期間に渡す "即時状態オブジェクト"を作成するのではなく、 デベロッパー(おそらく遅延)はインスタンス変数を使用するだけです。スペックによって対処され、ここで

キーは、いかなる場合にEJB開発者がそのようなフィールドは、EJBの呼出しに対して、意味のある情報 を維持することを前提としなければならないことあります。

+0

最後の引用について:あなたが引用した仕様のバージョンと段落を追加してください。 – Beryllium

+0

@ベリリウム私はポイントを強調しようとしていましたが、何も直接引用していませんでした。関連する見積もりを提供していることがわかります。それは素晴らしいことです。 「会話型」は、まさに私が作ろうとしていたポイント(そしてスペックの言葉!)です。 –

7

ステートレスセッションBeanはインスタンス無い会話状態を持つセッションBeanですEJB 3.1 spec

4.7ステートレスセッションBeanからの引用。つまり、 のすべてのBeanインスタンスは、クライアントが呼び出すメソッドの処理に関与していない場合には同等です。

「ステートレス」という用語は、インスタンスが特定のクライアントの状態を持たないことを示します。ただし、インスタンスの インスタンスの変数には、クライアントから呼び出されたメソッド呼び出しの状態を含めることができます。

このような例には、公開データベース接続とエンタープライズBeanオブジェクトへのオブジェクト参照が含まれます。

強調は、です。会話状態なしです。彼らは "他の"状態を持つことができます。


たとえば、私は負荷がクラスタノード内のすべてのインスタンス上で均等に広がっていたかどうかを確認するためにそれを使用している:

@Stateless(name = "DemoPingSb") 
@Remote(DemoPingSbIfc.class) 
public class DemoPingSb implements Serializable, DemoPingSbIfc { 
    private final AtomicInteger instancePingCount = new AtomicInteger(0); 
    private final static AtomicInteger classPingCount = new AtomicInteger(0); 

    public DemoPingSb() { 
     super(); 
    } 

    public String ping(final String s) { 
     final int local = this.instancePingCount.incrementAndGet(); 
     final int global = classPingCount.incrementAndGet(); 

     System.out.println("INFO: local " + local + ", global " + global 
       + ", s " + s); 

     return s.toUpperCase(); 
    } 
} 

、十分な負荷がある場合13:13:21,769 INFO [stdout](http-localhost-127.0.0.1-8080-1)INFO:ローカル22、グローバル22、hello
13:13:21,936 INFO [stdout](http-localhost-127.0。 0。1-8080-1)INFO:ローカル1、グローバル23、ハロー

この機能が役立つ場合があります。

備考

  • スペックを約インスタンス変数を語ります。 の静的変数の使用はここではカバーされていません。唯一のスレッドが実行できることを確認する必要があり、コンテナ(4.10.13)

ので、それでコードは、instancePingCountためAtomicIntegerの使用がでvolatile intに置き換えることができclassPingCount

  • に関して正しくない可能性がありますステートレスまたはステートフルセッションBean インスタンスはいつでも可能です。

    • ステートレスセッションBeanは不動態化されることはありません(4.2)
    +0

    +1、素晴らしい要約。 –

    関連する問題