2
@Stateless
public class MyBean1 {

    pulic void method1() {
        //method implementation
    }

    pulic void method2() {
        //method implementation
    } 
}

の特定のインスタンスを考えてみましょうMyBean1。次に、複数のスレッドが同時にアクセスできないことがわかりmethod1()ます。method2()しかし、method1()スレッドによってアクセスされている間method2()、別のスレッドからアクセスできますか?

4

2 に答える 2

3

ejb 3.1 仕様のセクション 4.3.14 に答えがあると思います。

4.3.14 セッション Bean メソッド
のシリアル化 次の要件は、ステートレスおよびステートフル セッション Bean に適用されます。Singleton セッション Bean の同時実行要件については、セクション 4.8.5 を参照してください。

コンテナーは、ステートフルおよびステートレスの各セッション Bean インスタンスへの呼び出しをシリアル化します。ほとんどのコンテナは、同時に実行されるセッション Bean の多数のインスタンスをサポートします。ただし、各インスタンスは、シリアル化された一連のメソッド呼び出しのみを認識します。したがって、ステートフルまたはステートレス セッション Bean を再入可能としてコーディングする必要はありません。

コンテナーは、コンテナーが呼び出すすべてのコールバック (つまり、ビジネス メソッド インターセプター メソッド、ライフサイクル コールバック インターセプター メソッド、タイムアウト コールバック メソッド、beforeCompletion など) をシリアル化する必要があり、これらのコールバックをクライアントが呼び出すビジネス メソッド呼び出しでシリアル化する必要があります。 .

....

EJB 仕様を理解している限り、同時実行性 (Bean 管理、コンテナー管理) をきめ細かく制御したい場合は、Singleton を使用する必要があります。

于 2013-08-02T04:32:58.000 に答える
1

あなたの例を少し変更しましょう

@Stateless
public class MyBean1 {
    @Resource
    private SessionContext sessionContext;

    pulic void method1() {
        // method implementation
        //   As a side-effect, something is written into a database
        //   using an XA data source,
        //   and a message is sent using XA JMS
        //   (both under control of an XA transaction)
    }

    pulic int method2(int i) {
        return i * i;
    } 
}

たとえば、セッション コンテキストUserTransactionはおよびを取得するために使用されますgetCallerPrincipal。これらは常に同じであるとは限りません (2 つのクライアントがすべて EJB の場合)。については、これは現在のスレッドUserTransactionにバインドされています( Javadocを参照)。

セッション コンテキストはフィールドに格納されるため (個々のメソッドに引数が渡されないため)、2 つの異なるクライアントから同じ EJB インスタンスにアクセスすることはできません。

したがって、仕様では、コンテナーが同じインスタンスへの呼び出しをシリアル化する必要があります。

method2副作用のない純粋に機能的な実装であるを見ると、EJB は必要ありません。

于 2013-08-02T06:34:25.287 に答える