ヘッダーをスキップ

Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド
10g(10.1.3.1.0)

B31852-03
目次
目次
索引
索引

戻る 次へ

5 EJB 3.0セッションBeanの使用方法

この章では、EJB 3.0セッションBeanを使用するために構成する必要のある様々なオプションについて説明します。

表5-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。また、ステートレス・セッションBeanに適用可能なオプションとステートフル・セッションBeanに適用可能なオプションも示します。

詳細は、次を参照してください。

非アクティブ化の構成

ステートフル・セッションBeanの非アクティブ化は、server.xmlファイルを使用して有効および無効にできます(「デプロイXMLの使用方法」を参照)。

次のいずれかの理由で非アクティブ化を無効にすることを選択できます。

詳細は、次を参照してください。

デプロイXMLの使用方法

EJB 3.0ステートフル・セッションBeanでは、EJB 2.1ステートフル・セッションBeanと同様に、server.xmlファイルで非アクティブ化を構成します(「デプロイXMLの使用方法」を参照)。

非アクティブ化基準の構成

OC4JがEJB 3.0ステートフル・セッションBeanを非アクティブ化する条件は、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して指定できます。

orion-ejb-jar.xmlファイルの構成は、OC4J固有のアノテーションを使用して設定された対応する構成をオーバーライドします。

詳細は、次を参照してください。

アノテーションの使用方法

EJB 3.0ステートフル・セッションBeanに対応するOC4J固有のデプロイ・オプションは、OC4J固有の@StatefulDeploymentアノテーションを使用して指定できます。例5-1に、@StatefulDeploymentアノテーションの次の属性を使用してEJB 3.0ステートレス・セッションBeanの非アクティブ化基準を構成する方法を示します。

これらの@StatefulDeploymentの属性の詳細は、表A-1を参照してください。@StatefulDeploymentアノテーションの詳細は、「EJB 3.0セッションBeanのOC4J固有のデプロイ・オプションの構成」を参照してください。

例5-1    @StatefulDeploymentを使用した非アクティブ化基準の構成

import javax.ejb.Stateless;
import oracle.j2ee.ejb.StatelessDeployment;

@Stateless
@StatefulDeployment(
    idletime=100,
    memoryThroshold=90,
    maxInstances=10,
    maxInstancesThreshold=80,
    passivateCount=3,
    resourceCheckInterval=90
)
public class HelloWorldBean implements HelloWorld {
    public void sayHello(String name) {
        System.out.println("Hello "+name +" from first EJB3.0");
    }
}

 

デプロイXMLの使用方法

EJB 3.0ステートフル・セッションBeanでは、EJB 2.1ステートフル・セッションBeanと同様に、orion-ejb-jar.xmlファイルで非アクティブ化基準を構成します(「デプロイXMLの使用方法」を参照)。

非アクティブ化の場所の構成

非アクティブ化時にOC4JがEJB 3.0ステートフル・セッションBeanをシリアライズするディレクトリおよびファイル名は、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して指定できます。

詳細は、次を参照してください。

アノテーションの使用方法

EJB 3.0ステートフル・セッションBeanに対応するOC4J固有のデプロイ・オプションは、OC4J固有の@StatefulDeploymentアノテーションを使用して指定できます。例5-1に、@StatefulDeploymentアノテーションのpersistenceFileName属性を使用してEJB 3.0ステートレス・セッションBeanの非アクティブ化の場所を構成する方法を示します。

この@StatefulDeploymentの属性の詳細は、表A-1を参照してください。@StatefulDeploymentアノテーションの詳細は、「EJB 3.0セッションBeanのOC4J固有のデプロイ・オプションの構成」を参照してください。

例5-2    @StatefulDeploymentを使用した非アクティブ化の場所の構成

import javax.ejb.Stateless;
import oracle.j2ee.ejb.StatelessDeployment;

@Stateless
@StatefulDeployment(
    persistenceFileNazme="C:¥sfsb¥sfsb.persistence",
)
public class HelloWorldBean implements HelloWorld {
    public void sayHello(String name) {
        System.out.println("Hello "+name +" from first EJB3.0");
    }
}

 

デプロイXMLの使用方法

EJB 3.0ステートフル・セッションBeanでは、EJB 2.1ステートフル・セッションBeanと同様に、orion-ejb-jar.xmlファイルで非アクティブ化の場所を構成します(「デプロイXMLの使用方法」を参照)。

EJB 3.0セッションBeanのライフ・サイクル・コールバック・インターセプタ・メソッドの構成

EJB 3.0セッションBeanクラス・メソッドを次のライフ・サイクル・イベントのコールバック・インターセプタ・メソッドとして指定できます(「アノテーションの使用方法」を参照)。

セッションBeanクラスのライフ・サイクル・コールバック・メソッドは、次のシグネチャを持つ必要があります。

void <METHOD>()

EJB 3.0セッションBeanに関連付けるインターセプタ・クラスで1つ以上のライフ・サイクル・コールバック・メソッドを指定することもできます(「EJB 3.0セッションBeanのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)。

詳細は、次を参照してください。

アノテーションの使用方法

次のいずれかのアノテーションを使用して、EJB 3.0セッションBeanクラス・メソッドをライフ・サイクル・コールバック・メソッドとして指定できます。

例5-3に、@PostConstructアノテーションを使用してEJB 3.0ステートフル・セッションBeanのクラス・メソッドinitializeをライフ・サイクル・コールバック・メソッドとして指定する方法を示します。

例5-3    @PostConstruct

@Stateful
public class CartBean implements Cart {
    private ArrayList items;

    @PostConstruct
    public void initialize() {
        items = new ArrayList();
    }
...
}

 

EJB 3.0セッションBeanのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成

EJB 3.0セッションBeanのインターセプタ・クラスのインターセプタ・メソッドをライフ・サイクル・コールバック・インターセプタ・メソッドとして指定できます。

インターセプタ・クラスでライフ・サイクル・コールバック・インターセプタ・メソッドを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します。

    これは、任意のPOJOクラスにすることができます。

  2. ライフ・サイクル・コールバック・インターセプタ・メソッドを実装します。

    Beanのインターセプタ・クラスに定義するコールバック・メソッドには、次のシグネチャを割り当てます。

    Object <METHOD>(InvocationContext)
    
    
  3. ライフ・サイクル・イベントをコールバック・インターセプタ・メソッドに関連付けます(「アノテーションの使用方法」を参照)。

    1つのライフ・サイクル・イベントは、1つのコールバック・インターセプタ・メソッドにのみ関連付けることができますが、1つのライフ・サイクル・コールバック・インターセプタ・メソッドは、複数のコールバック・イベントに割り込むために使用できます。たとえば、@PostConstruct@PreDestroyは、インターセプタ・クラス内で1回のみ出現可能ですが、@PostConstruct@PreDestroyの両方を同じコールバック・インターセプタ・メソッドに関連付けることができます。

  4. インターセプタ・クラスをEJB 3.0セッションBeanに関連付けます(「EJB 3.0セッションBeanのインターセプタ・クラスの構成」を参照)。

詳細は、次を参照してください。

アノテーションの使用方法

次のいずれかのアノテーションを使用して、インターセプタ・クラス・メソッドをEJB 3.0セッションBeanのライフ・サイクル・コールバック・メソッドとして指定できます。

例5-4に、ステートフル・セッションBeanのインターセプタ・クラスを示します。この例では、@PrePassivateアノテーションを使用して、メソッドmyPrePassivateInterceptorMethodをpre-passivateライフ・サイクル・イベントのライフ・サイクル・コールバック・インターセプタ・メソッドとして指定しています。また、@PostConstructおよび@PostActivateアノテーションを使用して、メソッドmyPostConstructInterceptorMethodをpost-constructとpost-activate両方のライフ・サイクル・イベントのライフ・サイクル・コールバック・インターセプタ・メソッドとして指定しています。OC4Jは、適切なライフ・サイクル・イベントが発生した場合にのみ、対応するライフ・サイクル・メソッドを起動します。OC4Jは、セッションBeanのビジネス・メソッドが起動されるたびに、ライフ・サイクル・インターセプタ・メソッド以外のすべてのインターセプタ・メソッド(myInterceptorMethodなど)を起動します(「EJB 3.0セッションBeanのインターセプタ・クラスの構成」を参照)。

例5-4    インターセプタ・クラス

public class MyStatefulSessionBeanInterceptor {
    ...
    protected void myInterceptorMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }

    @PostConstruct
    @PostActivate
    protected void myPostConstructInterceptorMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
    @PrePassivate
    protected void myPrePassivateInterceptorMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

EJB 3.0セッションBeanのAroundInvokeインターセプタ・メソッドの構成

1つの非ビジネス・メソッドをステートレスまたはステートフル・セッションBeanのインターセプタ・メソッドとして指定できます。クライアントがセッションBeanのビジネス・メソッドを起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドを起動します。クライアント起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

インターセプタ・メソッドには次のシグネチャがあります。

Object <METHOD>(InvocationContext) throws Exception

インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

このメソッドは、EJB 3.0セッションBeanクラスに指定するか(「アノテーションの使用方法」を参照)、EJB 3.0セッションBeanに関連付けるインターセプタ・クラスに指定できます(「EJB 3.0セッションBeanのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成」を参照)。

詳細は、「EJB 3.0インターセプタについて」を参照してください。

アノテーションの使用方法

例5-5に、@AroundInvokeアノテーションを使用してセッションBeanクラスのメソッドをインターセプタ・メソッドとして指定する方法を示します。クライアントがこのステートレス・セッションBeanのビジネス・メソッドを起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドmyInterceptorを起動します。クライアント起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

例5-5    EJB 3.0セッションBeanの@AroundInvoke

@Stateless
public class HelloWorldBean implements HelloWorld {
    public void sayHello() {
        System.out.println("Hello!");
    }

    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        Principal p = ctx.getEJBContext().getCallerPrincipal;
        if (!userIsValid(p)) {
            throw new SecurityException(
                "Caller: '" + p.getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }
}

 

EJB 3.0セッションBeanのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成

1つの非ビジネス・メソッドをステートレスまたはステートフル・セッションBeanのインターセプタ・メソッドとして指定できます。クライアントがセッションBeanのビジネス・メソッドを起動するたびに、OC4Jは起動をインターセプトし、インターセプタ・メソッドを起動します。クライアント起動は、インターセプタ・メソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

このメソッドは、EJB 3.0セッションBeanに関連付けるインターセプタ・クラスに指定するか、EJB 3.0セッションBeanクラスそれ自体に指定できます(「EJB 3.0セッションBeanのAroundInvokeインターセプタ・メソッドの構成」を参照)。

インターセプタ・クラスでインターセプタ・メソッドを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します。

    これは、任意のPOJOクラスにすることができます。

  2. インターセプタ・メソッドを実装します。

    インターセプタ・メソッドには次のシグネチャがあります。

    Object <METHOD>(InvocationContext) throws Exception
    
    

    インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

  3. メソッドをインターセプタ・メソッドとして指定します(「アノテーションの使用方法」を参照)。

  4. インターセプタ・クラスをEJB 3.0セッションBeanに関連付けます(「EJB 3.0セッションBeanのインターセプタ・クラスの構成」を参照)。

詳細は、「EJB 3.0インターセプタについて」を参照してください。

アノテーションの使用方法

例5-6に、@AroundInvokeアノテーションを使用してインターセプタ・クラス・メソッドのmyInterceptorをEJB 3.0セッションBeanのインターセプタ・メソッドとして指定する方法を示します。このインターセプタ・クラスをセッションBeanに関連付けると(「EJB 3.0セッションBeanのインターセプタ・クラスの構成」を参照)、セッションBeanのビジネス・メソッドが起動するたびに、OC4Jは起動をインターセプトし、myInterceptorメソッドを起動します。クライアント起動は、このメソッドがInvocationContext.proceed()を返す場合にのみ続行されます。

例5-6    インターセプタ・クラス

public class MyInterceptor {
    ...
    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        Principal p = ctx.getEJBContext().getCallerPrincipal;
        if (!userIsValid(p)) {
            throw new SecurityException(
                "Caller: '" + p.getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }

    @PreDestroy
    public void myPreDestroyMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

EJB 3.0セッションBeanのインターセプタ・クラスの構成

インターセプタ・クラスは、Beanクラスそれ自体とは異なる1つのクラスであり、そのメソッドはBeanのビジネス・メソッドの起動およびライフ・サイクル・イベントの発生に応じて起動されます。Beanクラスは、任意の数のインターセプタ・クラスに関連付けることができます。

インターセプタ・クラスは、EJB 3.0ステートレスまたはステートフル・セッションBeanに関連付けることができます。

インターセプタ・クラスを使用してEJB 3.0セッションBeanを構成するには、次のようにします。

  1. インターセプタ・クラスを作成します(「インターセプタ・クラスの作成」を参照)。

    これは、任意のPOJOクラスにすることができます。

  2. インターセプタ・クラスにインターセプタ・メソッドを実装します。

    インターセプタ・メソッドには次のシグネチャがあります。

    Object <METHOD>(InvocationContext) throws Exception
    
    

    インターセプタ・メソッドには、public、private、protectedまたはpackageレベルのアクセスを割り当てることができますが、finalまたはstaticとして宣言することはできません。

    インターセプタ・メソッドには、ライフ・サイクル・コールバックとして(「EJB 3.0セッションBeanのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)、またはAroundInvokeメソッドとして
    「EJB 3.0セッションBeanのインターセプタ・クラスのAroundInvokeインターセプタ・メソッドの構成」を参照)アノテーションを付けることができます。

  3. インターセプタ・クラスをEJB 3.0セッションBeanに関連付けます(「インターセプタ・クラスとセッションBeanとの関連付け」を参照)。

  4. オプションで、シングルトン・インターセプタを使用するようセッションBeanを構成します(「セッションBeanでのシングルトン・インターセプタの指定」を参照)。

詳細は、「EJB 3.0インターセプタについて」を参照してください。

アノテーションの使用方法

この項の内容は次のとおりです。

インターセプタ・クラスの作成

例5-7に、EJB 3.0セッションBeanのインターセプタ・クラスにAroundInvokeインターセプタ・メソッドおよびライフ・サイクル・コールバック・インターセプタ・メソッドを指定する方法を示します。このインターセプタ・クラスをセッションBeanに関連付けると(例5-8を参照)、セッションBeanのビジネス・メソッドが起動するたびに、OC4JはAroundInvokeメソッドのmyInterceptorを起動します。適切なライフ・サイクル・イベントが発生すると、OC4JはmyPreDestroyMethodなどの対応するライフ・サイクル・コールバック・インターセプタ・メソッドを起動します。

例5-7    インターセプタ・クラス

public class MyInterceptor {
    ...
    @AroundInvoke
    protected Object myInterceptor(InvocationContext ctx) throws Exception {
        Principal p = ctx.getEJBContext().getCallerPrincipal;
        if (!userIsValid(p)) {
            throw new SecurityException(
                "Caller: '" + p.getName() +
                "' does not have permissions for method " + ctx.getMethod()
            );
        }
        return ctx.proceed();
    }

    @PreDestroy
    public void myPreDestroyMethod (InvocationContext ctx) {
        ...
        ctx.proceed();
        ...
    }
}

 

インターセプタ・クラスとセッションBeanとの関連付け

インターセプタ・クラスは、@Interceptorsアノテーションを使用してEJB 3.0セッションBeanに関連付けることができます。例5-8に、例5-7のインターセプタ・クラスをEJB 3.0セッションBeanクラスに関連付ける方法を示します。

@PostConstructのライフ・サイクル・メソッドは、EJB 3.0セッションBeanクラスそれ自体のメソッドですが(「EJB 3.0セッションBeanのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)、@PreDestroyのライフ・サイクル・メソッドは、このセッションBeanに関連付けられたインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドです(「EJB 3.0セッションBeanのインターセプタ・クラスのライフ・サイクル・コールバック・インターセプタ・メソッドの構成」を参照)。

例5-8    インターセプタ・クラスとEJB 3.0セッションBeanの関連付け

@Stateful
@Interceptors(MyInterceptor.class)
public class CartBean implements Cart {
    private ArrayList items;

    @PostConstruct
    public void initialize() {
        items = new ArrayList();
    }
    ...
}

 

セッションBeanでのシングルトン・インターセプタの指定

例5-9に示すように、@StatelessDeploymentまたは@StatefulDeploymentの属性interceptorTypesingletonに設定することで、シングルトン・インターセプタ・クラスを使用するようOC4Jを構成できます。このセッションBeanのすべてのインスタンスは、MyInterceptorの同じインスタンスを共有します。MyInterceptorクラスは、ステートレスである必要があります。

この属性の詳細は、表A-1を参照してください。シングルトン・インターセプタの詳細は、「シングルトン・インターセプタ」を参照してください。

例5-9    EJB 3.0ステートフル・セッションBeanでのシングルトン・インターセプタ・クラスの指定

@Stateful
@StatefulDeployment(interceptorType="singleton")
@Interceptors(MyInterceptor.class)
public class CartBean implements Cart {
    private ArrayList items;

    @PostConstruct
    public void initialize() {
        items = new ArrayList();
    }
    ...
}

EJB 3.0セッションBeanのOC4J固有のデプロイ・オプションの構成

EJB 3.0セッションBeanのOC4J固有のデプロイ・オプションは、OC4J固有のアノテーション(「アノテーションの使用方法」を参照)またはorion-ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)を使用して構成できます。

orion-ejb-jar.xmlファイルの構成は、OC4J固有のアノテーションを使用して設定された対応する構成をオーバーライドします。

アノテーションの使用方法

EJB 3.0セッションBeanのOC4J固有のデプロイ・オプションは、次のOC4J固有のアノテーションを使用して指定できます。

例5-10に、@StatelessDeploymentアノテーションを使用してEJB 3.0ステートレス・セッションBeanのOC4J固有のデプロイ・オプションを構成する方法を示します。

@StatelessDeploymentの属性の詳細は、表A-1を参照してください。

例5-10    @StatelessDeployment

import javax.ejb.Stateless;
import oracle.j2ee.ejb.StatelessDeployment;

@Stateless
@StatelessDeployment(
    minInstances=5,
    poolCacheTimeout=90
)
public class HelloWorldBean implements HelloWorld {
    public void sayHello(String name) {
        System.out.println("Hello "+name +" from first EJB3.0");
    }
}

例5-11に、@StatefulDeploymentアノテーションを使用し
てEJB 3.0ステートフル・セッションBeanのOC4J固有のデプロイ・オプションを構成する方法を示します。

@StatefulDeploymentの属性の詳細は、表A-1を参照してください。

例5-11    @StatefulDeployment

import javax.ejb.Stateful
import oracle.j2ee.ejb.StatefulDeployment;

@Stateful
@StatefulDeployment(
    idletime=100
    passivateCount=3
)
public class CartBean implements Cart {
    private ArrayList items;
    ...
}

 

デプロイXMLの使用方法

例5-12に示すように、OC4J固有のデプロイ・オプションは、orion-ejb-jar.xmlファイルの<session-deployment>要素を使用して指定できます。

<session-deployment>要素の詳細は、「<session-deployment>」を参照してください。

例5-12    orion-ejb-jar.xmlファイルの<session-deployment>要素

<?xml version="1.0" encoding="utf-8"?>
<orion-ejb-jar
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-ejb-jar-10_0.xsd"
    deployment-version="10.1.3.1.0"
    deployment-time="10b1fb5cdd0"
    schema-major-version="10"
    schema-minor-version="0"
>
    <enterprise-beans>
        <session-deployment
            name="MBeanServerEjb"
            call-timeout="0"
            location="MBeanServerEjb"
            local-location="admin_ejb_MBeanServerEjbLocal"
            timeout="0"
            ...
        >
        </session-deployment>
    ...
    </enterprise-beans>
    ...
</orion-ejb-jar>


戻る 次へ
Oracle
Copyright © 2002, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引