プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発
12c (12.2.1.1.0)
E82895-01
目次へ移動
目次

前
次

4 Enterprise JavaBeansの実装

この章では、EJBの実装プロセスについて説明し、WebLogic ServerでEJBを起動し実行する方法について説明します。

この章は、WebLogic ServerのEJBの付加価値機能を理解し、アプリケーションの設計パターンをすでに選択しており、主要な設計上の決定をすでに行っている読者を対象としています。

WebLogic Server EJBの機能の概要については、「WebLogic ServerのEJBの付加価値機能」を参照してください

EJBの設計オプション、設計の過程で考慮する要素、およびお薦めの設計パターンについては、「Enterprise JavaBeansの設計」を参照してください

この章の内容は次のとおりです:

EJB開発プロセスの概要

この節では、EJB開発プロセスを簡単に説明します。主な実装タスクと関連する結果について説明します。

図4-1に、EJBの開発プロセスを示します。プロセスの手順、および各手順の結果については、表4-1を参照してください。以下の節では、各手順について詳しく説明します。

図4-1 EJB開発プロセスの概要

図4-1の説明が続きます
「図4-1 EJB開発プロセスの概要」の説明

表4-1 EJB開発タスクと結果

ステップ 説明 結果

ソース・ディレクトリを作成する

ソース・ファイル、デプロイメント記述子、および実装の過程で生成されるファイルのディレクトリ構造を作成します。

ローカル・ドライブ上のディレクトリ構造

EJBのクラスとインタフェースを作成する

Beanを構成するクラスを作成します。適切なタグをソース・コードに挿入して、これ以降の実装プロセスでのデプロイメント記述子要素の自動生成を有効にします。

各クラスの.javaファイル

Javaソースをコンパイルする

ソース・コードをコンパイルします。

各クラスの.classファイル

デプロイメント記述子を生成する

Beanの実行時の動作と環境を構成するデプロイメント記述子を記述または生成します。

ejb-jar.xmlとオプションとして以下のもの

  • weblogic-ejb-jar.xml (WebLogic Server固有の機能を制御する要素が格納されます)

  • weblogic-cmp-jar.xml (Beanがコンテナ管理による永続性エンティティBeanである場合)

デプロイメント記述子を編集する

Beanの目的の実行時動作がすべて正しく反映されるように、デプロイメント記述子の編集が必要な場合もあります。

Beanが使用するオプションの機能を指定するマークアップがソース全体に記述され、EJBGenを使用してデプロイメント記述子を自動的に生成する場合、デプロイメント記述子の編集は最小限にする必要があります。

  • ejb-jar.xml

  • weblogic-ejb-jar.xml (WebLogic Server固有の機能を制御する要素が格納されます)

  • weblogic-cmp-jar.xml (Beanがコンテナ管理による永続性エンティティBeanである場合)

EJBラッパー・クラスとスタブおよびスケルトン・ファイルを生成する

ホーム・インタフェースやリモート・インタフェースのクラスを含む、デプロイメント・ユニットにアクセスするためのコンテナ・クラスを生成します。

生成されたクラスはアーカイブまたはディレクトリに追加されます。

パッケージ化する

コンパイル済みファイル、生成ファイル、およびデプロイメント記述子をデプロイメント用にパッケージ化します。

状況によっては、ファイルをアーカイブせずにディレクトリ形式で展開しておくことも可能です。

アーカイブ(JARまたはEAR)

デプロイする

選択したステージング・モードに従って、アーカイブまたはアプリケーション・ディレクトリのターゲットとして目的の管理対象サーバーまたはWebLogic Serverクラスタを設定します。

Beanのデプロイメント設定は、config.xmlEJBComponent要素に書き込まれます。


ソース・ディレクトリを作成する

EJBをアセンブルするソース・ディレクトリを作成します。

ソース・ファイルと出力ファイルを並列ディレクトリ構造に分離する分割開発ディレクトリ構造をお薦めします。分割ディレクトリ構造を準備し、EJBをエンタープライズ・アプリケーション・アーカイブ(EAR)としてパッケージ化する方法については、Oracle WebLogic Serverアプリケーションの開発の分割開発ディレクトリ構造の概要を参照してください。

EJBをJARファイルにパッケージ化してデプロイする場合は、クラス・ファイルのディレクトリと、デプロイメント記述子ファイル用のMETA-INFというサブディレクトリを作成します。

例4-1 JARをパッケージ化するためのディレクトリ構造

myEJB/
    META-INF/
        ejb-jar.xml
        weblogic-ejb-jar.xml
        weblogic-cmp-jar.xml
    foo.class
    fooHome.class
    fooBean.class

EJBのクラスとインタフェースを作成する

必要なクラスは、開発するEJBのタイプによって異なります(EJBの構成要素を参照)。

クラス・ファイルおよびインタフェース・ファイルを開発するための生産性の高いツールが用意されています。EJBGenコマンド・ライン・ユーティリティはクラス・ファイルとインタフェース・ファイルの作成プロセスを自動化するとともに、EJBのデプロイメント記述子ファイルも生成します。これらのツールの詳細と使い方については、「EJBGenリファレンス」を参照してください

以降の節では、WebLogic Server固有のEJB機能を使用する上でのヒントとガイドラインを示します。

WebLogic Serverの汎用的なBeanテンプレートの使い方

WebLogic Serverでは、各EJBタイプについて、ほとんどのEJBで必要なJavaコールバック(リスナー)が含まれる汎用クラスが提供されます。それらの汎用クラスは、weblogic.ejb パッケージにあります。

  • GenericEnterpriseBean

  • GenericEntityBean

  • GenericMessageDrivenBean

  • GenericSessionBean

汎用Beanテンプレートは、その汎用クラスを作成中のクラスにインポートすることで独自のクラスで実装できます。次の例では、GenericSessionBeanクラスがHelloWorldEJBにインポートされます。

import weblogic.ejb.GenericSessionBean;
     ...     
public class HelloWorldEJB extends GenericSessionBean { 

クライアントによるEJBへのアクセスのプログラミング

以降の節では、EJBに対するクライアント・アクセスをプログラミングするためのガイドラインを示します。

クライアントによる初期コンテキストの取得のプログラミング

ローカル・クライアントは、次の抜粋のようなgetInitialContextメソッドを使用して初期コンテキストを取得します。

例4-2 ルックアップを実行するローカル・クライアント

...
Context ctx = getInitialContexLt("t3://localhost:7001", "user1", "user1Password");
...
static Context getInitialContext(String url, String user, String password) { 
    Properties h = new Properties();
        "weblogic.jndi.WLInitialContextFactory");
    h.put(Context.PROVIDER_URL, url);
    h.put(Context.SECURITY_PRINCIPAL, user);
    h.put(Context.SECURITY_CREDENTIALS, password); 

    return new InitialContext(h);
}

リモート・クライアントは、WebLogic Server InitialContextファクトリからInitialContextを取得します。

クライアントによるホーム・インタフェースのルックアップのプログラミング

クライアントは、次の2つの方法のいずれかでエンティティBeanのホーム・インタフェースをルックアップできます。

  • EJB参照に従います。Java Naming and Directory Interfaceから直接ホーム・インタフェースをルックアップする方法であり、もう1つの方法よりパフォーマンスがよく、Oracleのベスト・プラクティスです。EJB参照の使い方については、次節「EJBリンクの使用」を参照してください

  • Java Naming and Directory Interface (JNDI)から直接。コンテナが、グローバルなサーバー側のJNDIネームスペースでエンティティBeanのホーム・インタフェースをバインドします。手順については、Oracle WebLogic Server JNDIアプリケーションの開発を参照してください。

EJBリンクの使用

EJBリンクの使用はOracleのベスト・プラクティスであり、WebLogic ServerはEJB 2.1仕様で定義されているEJBリンクを完全にサポートしています。アプリケーション・コンポーネント内でEJB参照を宣言し、これを同じJava EEアプリケーション内で宣言されたエンタープライズBeanにリンクさせることができます。

ejb-jar.xmlファイルで、参照元アプリケーション・コンポーネントのejb-ref要素のejb-link要素を使用してEJBへのリンクを指定します。ejb-linkの値は、参照先EJBのejb-jar.xmlweblogic-ejb-jar.xml両方のejb-nameの値と同じでなければなりません。参照先のEJBは、参照元アプリケーション・コンポーネントと同じJava EEアプリケーションのEJB JARファイルのどれかに含まれていると考えられます。

ejb-nameはEJB JARファイル間で必ずしもユニークでなくてもよいため、そのリンクの絶対パスを与える必要があるかもしれません。次の構文を使って、同じJava EEアプリケーション内のEJBへのパス名を与えます。

<ejb-link>../products/product.jar#ProductEJB</ejb-link>

この参照では参照先のEJBが含まれるEJB JARファイルのパス名を与え、「#」でパス名と区別して参照先Beanのejb-nameを追加します。このパス名は、参照元のアプリケーション・コンポーネントJARファイルからの相対パスです。

URLに要求を送信するようにEJBを構成する

EJBがjava.net.URLリソース・マネージャ接続ファクトリ・タイプを使用して外部HTTPサーバーとのHttpURLConnectionを開くようにするには、URLまたはURLに対応するJNDIツリーでバインドされたオブジェクトをejb-jar.xmlresource-ref要素およびweblogic-ejb-jar.xmlres-ref-name要素を使用して指定します。

URLによるHTTPリソースの指定

EJBが要求を送信するURLを指定するには、次の手順に従います。

  1. ejb-jar.xmlresource-ref要素の<jndi-name>要素でURLを指定します。
  2. weblogic-ejb-jar.xmlresource-description要素の<jndi-name>要素でURLを指定します。
    <resource-description>
        <res-ref-name>url/MyURL</res-ref-name>
        <jndi-name>http://www.rediff.com/</jndi-name>
    </resource-description>
    

    WebLogic Serverは指定されたjndi-nameでURLオブジェクトを作成し、そのオブジェクトをjava:comp/envにバインドします。

JNDI名によるHTTPリソースの指定

URLを指定する代わりに、JNDIでバインドされ、URLに対応するオブジェクトを指定するには、次のようにします。

  1. ejb-jar.xmlresource-ref要素の<jndi-name>要素で、URLがJNDIでバインドされている名前を指定します。
  2. 次のように、weblogic-ejb-jar.xmlresource-description要素の<jndi-name>要素で、URLがJNDIでバインドされている名前を指定します。
    <resource-description>
        <res-ref-name>url/MyURL1</res-ref-name>
        <jndi-name>firstName</jndi-name>
    </resource-description>
    

    firstNameは、URLに対応するJNDIツリーにバインドされたオブジェクトです。このバインディングは、起動クラスで行うこともできます。jndi-nameが有効なURLでない場合、WebLogic ServerはそれをURLに対応し、すでにJNDIツリーにバインドされているオブジェクトとして取り扱い、LinkRefとそのjndi-nameをバインドします。

BeanコードからのHTTPリソースへのアクセス

HTTPリソースの指定方法(URLかURLに対応するJNDI名か)に関係なく、次のようにしてEJBのコードからそのHTTPリソースにアクセスできます。

URL url = (URL) context.lookup("java:comp/env/url/MyURL");
connection = (HttpURLConnection)url.openConnection();

EJBのネットワーク通信の構成

EJBが通信に使用するネットワーク接続の属性は、カスタム・ネットワーク・チャネルを構成してEJBに割り当てることによって設定できます。WebLogic Serverのネットワーク・チャネルとそれに関連する構成手順の詳細は、Oracle WebLogic Serverサーバー環境の管理のネットワーク・リソースの構成を参照してください。カスタム・チャネルを構成したら、weblogic-ejb-jar.xmlnetwork-access-point要素を使用してEJBに割り当てます。

トランザクションのプログラミングと構成

トランザクション設計上の決定事項については、「トランザクションの設計と管理のオプション」を参照してください以降の節では、トランザクション・プログラミングのガイドラインを示します。

トランザクションをエンティティBeanと使用することについては、「ejbLoad()とejbStore()の動作の理解」を参照してください

コンテナ管理によるトランザクションのプログラミング

コンテナ管理によるトランザクションは、Bean管理によるトランザクションよりもプログラミングが簡単です。その理由は、境界設定(トランザクションの開始と停止)がEJBコンテナで行われるからです。

トランザクション動作は、ejb-jar.xmlおよびweblogic-ejb-jar.xmlで構成します。関連情報については、「コンテナ管理によるトランザクション要素」を参照してください

コンテナ管理によるトランザクションの主なプログラミング・ガイドラインは以下のとおりです。

  • トランザクション境界の保持 - コンテナが設定したトランザクションの境界に干渉するメソッドは呼び出さないでください。以下のメソッドは使用しないでください。

    • java.sql.ConnectioncommitsetAutoCommit、およびrollbackメソッド

    • javax.ejb.EJBContextgetUserTransactionメソッド

    • javax.transaction.UserTransactionのすべてのメソッド

  • トランザクションの明示的なロールバック - 明示的にコンテナがコンテナ管理によるトランザクションをロールバックするようにするには、EJBContextインタフェースのsetRollbackOnlyメソッドを呼び出します。(Beanからアプリケーション例外(主としてEJBException)が送出される場合、ロールバックは自動的に行われます。)

  • シリアライゼーション問題の回避 - 多くのデータ・ストアでは、シリアライゼーションに関する問題の検出は、単一ユーザー接続の場合でさえ制限されています。そのような場合は、weblogic-ejb-jar.xmltransaction-isolationTransactionSerializableに設定されていても、同じ行でクライアント間に競合が発生した場合はEJBクライアントで例外またはロールバックが発生する場合があります。そのような例外を回避するために、以下のことができます。

    • SQL例外を捕捉して(たとえばトランザクションをやり直すなどして)適切に解決するコードをクライアント・アプリケーションに含める

    • Oracleデータベースの場合は、「isolation-level」で説明されているトランザクションのアイソレーション設定を使用する

コンテナ管理トランザクションの自動的な再試行の構成

このリリースのWebLogic Serverでは、トランザクションを開始したビジネス・メソッドが、システム例外に関連のないトランザクション・ロールバックが原因で失敗した場合、EJBコンテナが新しいトランザクションを開始し、失敗したメソッドを指定された回数まで再試行するように指定できます。メソッドの失敗が指定された再試行回数に達した場合、EJBコンテナは例外を送出します。

注意:

EJBコンテナは、システム例外に基づくエラーが原因で失敗したトランザクションは再試行しません。

コンテナ管理によるトランザクションの自動的な再試行を構成するには、次の手順に従います。

  1. 使用するBeanがコンテナ管理によるセッションBeanまたはエンティティBeanであることを確認します。

    コンテナ管理によるセッションBeanおよびエンティティBeanの場合にのみ、コンテナ管理によるトランザクションの自動再試行を構成できます。メッセージドリブンBeanの場合は、コンテナ管理によるトランザクションの自動再試行を構成できません。MDBは、メッセージの受信を含むトランザクションがロールバックされたときに、そのメッセージの受信の確認応答を行わないため、メッセージは確認応答が行われるまで自動的に再試行されます。また、タイマーBeanの場合も、コンテナ管理によるトランザクションの自動再試行は構成できません。タイマーBeanのejbTimeoutメソッドが開始されてロールバックされると、タイムアウトが常に再試行されるからです。

  2. トランザクションの自動再試行を構成する場合、対象となるビジネス・メソッドは、Beanのリモートまたはローカル・インタフェースの内部か、またはホーム・インタフェースのホーム・メソッド(特定のBeanインスタンスに固有ではないローカル・ホーム・ビジネス・ロジック)として定義されている必要があります。メソッドには、以下のコンテナ管理トランザクション属性の1つが設定されていなければなりません。
    • RequiresNew。メソッドのトランザクション属性(ejb-jar.xmltrans-attribute要素)がRequiresNewの場合、メソッドの呼出し前に常に新しいトランザクションが開始され、構成されている場合、そのトランザクションが失敗すると自動再試行が行われます。

    • Required。メソッドのトランザクション属性(ejb-jar.xmltrans-attribute要素)がRequiredの場合、メソッドが新しいトランザクションで再試行されるのは、失敗したトランザクションがそのメソッドのために開始された場合のみです。

    詳細については、以下を参照してください。

  3. トランザクションの自動再試行を有効にする場合、対象となるメソッドは再呼出しできなければなりません。失敗したメソッドの再試行によって得られる結果は、直前の再試行が成功した場合に得られる結果と同じでなければなりません。特に、以下の場合です。
    • メソッドの呼出しによって呼出しチェーンが開始された場合、そのメソッドを再試行するときは呼出しチェーン全体を再呼び出しするのが安全です。

    • メソッドのすべてのパラメータを再利用できなければなりません。メソッドが再試行される場合、そのメソッドは失敗したメソッドを呼び出すために使用されたパラメータで再試行されます。一般に、再利用できるパラメータは、プリミティブ、不変オブジェクト、または読取り専用オブジェクトの参照です。パラメータがメソッドによって変更されるオブジェクトの参照である場合、メソッドの再呼出しによってメソッド呼出しの結果に悪影響が生じてはなりません。

    • 再試行されるメソッドを保持するBeanがステートフル・セッションBeanである場合、そのBeanの対話状態は再呼出し時に失われてはなりません。ステートフル・セッションBeanの状態はトランザクション対応ではなく、トランザクションのロールバック中に復元できないので、トランザクションの自動再試行の機能を使用する場合、Beanの状態がロールバック後も有効であることを確認しておく必要があります。

  4. EJBコンテナがどのメソッドのトランザクションを自動的に再試行するか、およびその回数は、weblogic-ejb-jar.xmlretry-methods-on-rollback要素で指定します。

    retry-methods-on-rollbackのretry-count下位要素は、WebLogic Server管理コンソールからも変更できます。

Bean管理のトランザクションのプログラミング

この節では、Bean管理によるトランザクションのプログラミング上の考慮事項を示します。Beanレベルのトランザクションの特徴的な機能の概要や関連する設計上の考慮事項の説明については、「Beanレベルのトランザクション管理」を参照してください

  • トランザクションの境界設定 - EJBまたはクライアント・コードにトランザクション境界を定義するには、Java Transaction Service (JTS)またはJDBCデータベース接続を取得する前に、UserTransactionオブジェクトを取得してトランザクションを開始しなければなりません。UserTransactionオブジェクトを取得するには、次のコマンドを使用します。

    ctx.lookup("javax.transaction.UserTransaction");
    

    UserTransactionオブジェクトを取得した後は、tx.begin()tx.commit()tx.rollback()でトランザクションの境界を指定します。

    データベース接続を取得してからトランザクションを開始した場合、その接続は新しいトランザクションと何の関連性も持たず、以後のトランザクション・コンテキストにその接続を「入れる」ためのセマンティクスも存在しません。JTS接続がトランザクション・コンテキストに関連付けられていない場合、JTS接続はautocommittrueに設定した標準のJDBC接続と同じように動作し、更新はデータ・ストアに自動的にコミットされます。

    いったんトランザクション・コンテキスト内にデータベース接続が作成されると、その接続はトランザクションがコミットまたはロールバックされるまで確保されます。パフォーマンスとスループットを最適化するには、トランザクションを迅速に完了させることによって、データベース接続を解放し、他のクライアント要求が使用できるようにする必要があります。

    注意:

    アクティブなトランザクション・コンテキストには単一のデータベース接続しか関連付けることができません。

  • トランザクション・アイソレーション・レベルの設定 - Bean管理によるトランザクションでは、アイソレーション・レベルはBeanコードで定義します。有効なアイソレーション・レベルは、java.sql.Connectionインタフェースで定義されます。アイソレーション・レベルの動作については、isolation-levelを参照してください。

    サンプル・コードについては、例4-3を参照してください。

  • 制限されたメソッドの回避 - Bean管理によるトランザクションでは、EJBContextインタフェースのgetRollbackOnlyメソッドとsetRollbackOnlyメソッドは呼び出さないでください。これらのメソッドは、コンテナ管理によるトランザクションのみで使用します。Bean管理によるトランザクションでは、UserTransactionインタフェースのgetStatusメソッドとrollbackメソッドを呼び出します。

  • アクティブなトランザクション・コンテキストにつき1つの接続の使用 - アクティブなトランザクション・コンテキストに関連付けることができるのは、1つのデータベース接続だけです。

例4-3 BMTでのトランザクション・アイソレーション・レベルの設定

import javax.transaction.Transaction;
import java.sql.Connection
import weblogic.transaction.TxHelper:
import weblogic.transaction.Transaction;
import weblogic.transaction.TxConstants;
User Transaction tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");
//Begin user transaction
    tx.begin();
//Set transaction isolation level to TransactionReadCommitted
Transaction tx = TxHelper.getTransaction();
    tx.setProperty (TxConstants.ISOLATION_LEVEL, new Integer
    (Connection.TransactionReadCommitted));
//perform transaction work 
    tx.commit();

複数のEJBで分散されるトランザクションのプログラミング

この節では、複数のBean (複数のサーバー・インスタンスに存在する場合もある)にトランザクションを分散させる2つのアプローチを説明します。

クライアントのトランザクション・コンテキストから複数のEJBを呼び出す

次の断片的なコードは、UserTransactionオブジェクトを取得し、それを使用してトランザクションを開始およびコミットするクライアント・アプリケーションから引用したものです。クライアントは、トランザクションのコンテキストの中で2つのEJBを呼び出します。

import javax.transaction.*;
...
u = (UserTransaction) jndiContext.lookup("javax.transaction.UserTransaction");
u.begin();
account1.withdraw(100);
account2.deposit(100);
u.commit();
...

account1account2のBeanで実行される更新は、1つのUserTransactionのコンテキスト内で行われます。同じサーバー・インスタンス上にあるか、異なるサーバー・インスタンスにあるか、またはWebLogic Serverクラスタにあるのかに関係なく、EJBは1つの論理単位として一緒にコミットまたはロールバックされます。

1つのトランザクション・コンテキストから呼び出されるEJBはすべて、クライアント・トランザクションをサポートしている必要があります。つまり、ejb-jar.xmlの各Beanのtrans-attribute要素が、RequiredSupports、またはMandatoryに設定されている必要があります。

EJB「ラッパー」を使用してEJB間トランザクションをカプセル化する

トランザクションをカプセル化する「ラッパー」EJBを使用できます。クライアントはラッパーEJBを呼び出して銀行振替などのアクションを実行し、ラッパーは新しいトランザクションを開始して、トランザクションの処理を実行する1つまたは複数のEJBを呼び出します。

ラッパーEJBは、他のEJBを呼び出す前にトランザクション・コンテキストを明示的に取得できます。あるいは、ejb-jar.xmlでラッパーのtrans-attribute要素がRequiredまたはRequiresNewに設定されている場合、WebLogic Serverは新しいトランザクション・コンテキストを自動的に作成できます。

ラッパーEJBによって呼び出されるすべてのEJBは、そのラッパーEJBのトランザクション・コンテキストをサポートしている必要があります。つまり、そのtrans-attribute要素がRequiredSupports、またはMandatoryに設定されていなければなりません。

EJBタイマー・サービスのプログラミング

WebLogic Serverは、EJB 2.1仕様とEJB 3.0仕様で定義されているEJBタイマー・サービスをサポートしています。EJBタイマー・サービスはEJBコンテナによって提供されるサービスです。このサービスを使用すると、タイマー・オブジェクトが期限切れになったときに発生するコールバックをスケジューリングするタイマーを作成できます。タイマー・オブジェクトは、エンティティBean、メッセージドリブンBean、およびステートレス・セッションBean用に作成できます。タイマー・オブジェクトは、指定した時間、指定した期間の経過後、または指定した間隔で期限切れになります。たとえば、タイマー・サービスを使用して、EJBが一定期間にわたって特定の状態のままであるときに通知を送信できます。

WebLogic EJBタイマー・サービスは、大まかなタイマー・サービスとして使用するように設計されています。大量のタイマー・オブジェクトを使用してデータ・セットに対して同じタスクを実行するより、少数のタイマーを使用して大量のタスクを実行することをお薦めします。たとえば、従業員の経費レポートを表すEJBがあるとします。各経費レポートは、マネージャの承認を受けてから処理されなければなりません。この場合、1つのEJBタイマーを使用してすべての未決の経費レポートを定期的に検査し、担当のマネージャに対して、承認待ちのレポートを決裁するように促す電子メールを送信できます。

クラスタ化されたEJBタイマー・サービスとローカルEJBタイマー・サービス

EJBタイマー・サービスは、2つのタイプ(クラスタまたはローカル)を構成することができます。

クラスタ化されたEJBタイマー・サービス

クラスタ化されたEJBタイマー・サービスには、次の利点があります。

  • 可視性に優れています。

    クラスタ内のすべてのノードからタイマーにアクセスできます。たとえば、javax.ejb.TimerService.getTimers()メソッドを使用すると、EJBに対して作成されたクラスタに含まれるすべてのステートレス・セッションBeanタイマーまたはメッセージドリブンBeanタイマーの完全なリストが返されます。エンティティBeanの主キーをgetTimers()メソッドに渡すと、そのエンティティBeanのタイマーのリストが返されます。

  • 自動ロード・バランシングおよびフェイルオーバー

    クラスタ化されたEJBタイマー・サービスは、ジョブ・スケジューラのロード・バランシング機能とフェイルオーバー機能を利用できます。

クラスタ化されたEJBタイマー・サービスの構成については、「クラスタ化されたEJBタイマーの構成」を参照してください

ローカルEJBタイマー・サービス

ローカルEJBタイマー・サービスは、ローカルEJBタイマー・サービスが作成されたサーバー上でのみ実行され、そのサーバー上のBeanにしか認識されません。ローカルEJBタイマー・サービスを使用する場合、クラスタ化されたEJBタイマー・サービスとは異なり、クラスタ、データベース、JDBCデータ・ソース、またはリース・サービスを構成する必要はありません。

ローカルEJBタイマー・オブジェクトは、別のサーバーに移行できません。タイマー・オブジェクトは、サーバー全体の一部としてのみ移行できます。EJBタイマーが存在するサーバーが何らかの理由でダウンした場合、サーバーを再起動するか、またはサーバー全体を移行しなければタイマーを実行できません。

Javaプログラミング・インタフェースを使用してタイマー・オブジェクトをプログラミングする

この節では、EJB 2.1仕様に定義されている、タイマーのプログラミングに使用できるJavaプログラミング・インタフェースについて説明します。これらのインタフェースの詳細については、EJB 2.1仕様を参照してください。また、この節では、WebLogic Server固有のタイマー関連インタフェースについて詳しく説明します。

EJB 2.1タイマー関連プログラミング・インタフェース

次の表に、タイマーのプログラミングに使用できるEJB 2.1インタフェースを示します。


表4-2 EJB 2.1タイマー関連プログラミング・インタフェース

プログラミング・インタフェース 説明

javax.ejb.TimedObject

タイマー・コールバックのためにタイマー・サービスに登録されるBeanのエンタープライズBeanクラスによって実装されます。このインタフェースは、単一のメソッド、ejbTimeoutを備えています。

EJBContext

getTimerServiceメソッドを使用してタイマー・サービスにアクセスします。

javax.ejb.TimerService

EJBの新しいEJBタイマーを作成するか、既存のEJBタイマーにアクセスします。

javax.ejb.Timer

特定のEJBタイマーに関する情報にアクセスします。

javax.ejb.TimerHandle

永続化できるシリアライズ可能なタイマー・ハンドルを定義します。タイマーはローカル・オブジェクトなので、TimerHandleはBeanのリモート・インタフェースまたはWebサービス・インタフェースを介して渡してはなりません。


EJB 2.1のタイマー関連プログラミング・インタフェースの詳細については、EJB 2.1仕様を参照してください。

WebLogic Server固有のタイマー関連インタフェース

タイマーのプログラミングに使用できるWebLogic Server固有のインタフェースは以下のとおりです。

  • weblogic.management.runtime.EJBTimerRuntimeMBean。特定のEJBHomeのタイマーの実行時情報と管理機能を提供します。例4-4weblogic.management.runtime.EJBTimerRuntimeMBeanインタフェースを示します。

  • weblogic.ejb.WLTimerServiceインタフェース。javax.ejb.TimerServiceインタフェースの拡張です。このインタフェースを使用すると、タイマーに関するWebLogic Server固有の構成情報を指定できます。例4-5weblogic.ejb.WLTimerServiceインタフェースを示します。javax.ejb.TimerServiceの詳細は、EJB 2.1仕様を参照してください。

    注意:

    weblogic.ejb.WLTimerServiceインタフェースは、クラスタ化EJBタイマー・サービスではサポートされません(「クラスタ化EJBタイマーの構成」を参照)。

  • weblogic.ejb.WLTimerInfoインタフェース。weblogic.ejb.WLTimerServiceインタフェースで使用され、タイマーに関するWebLogic Server固有の構成情報を渡します。例4-6weblogic.ejb.WLTimerInfoインタフェースを示します。

    注意:

    weblogic.ejb.WLTimerServiceインタフェースは、クラスタ化EJBタイマー・サービスではサポートされません(「クラスタ化EJBタイマーの構成」を参照)。

  • weblogic.ejb.WLTimerインタフェース。javax.ejb.Timerインタフェースの拡張であり、タイマーの現在の状態に関する追加情報を提供します。例4-7weblogic.ejb.WLTimerインタフェースを示します。

    注意:

    weblogic.ejb.WLTimerServiceインタフェースは、クラスタ化EJBタイマー・サービスではサポートされません(「クラスタ化EJBタイマーの構成」を参照)。

例4-4 weblogic.management.runtime.EJBTimerRuntimeMBeanインタフェース

public interface weblogic.management.runtime.EJBTimerRuntimeMBean {
  public int getTimeoutCount(); // get the number of successful timeout notifications that have been made
  public int getActiveTimerCount(); // get the number of active timers for this EJBHome
  public int getCancelledTimerCount(); // get the number of timers that have been cancelled for this EJBHome
  public int getDisabledTimerCount(); // get the number of timers temporarily disabled for this EJBHome
  public void activateDisabledTimers(); // activate any temporarily disabled timers
}

例4-5 weblogic.ejb.WLTimerServiceインタフェース

public interface WLTimerService extends TimerService {
  public Timer createTimer(Date initial, long duration, Serializable info,
    WLTimerInfo wlTimerInfo)
    throws IllegalArgumentException, IllegalStateException, EJBException;
  public Timer createTimer(Date expiration, Serializable info,
    WLTimerInfo wlTimerInfo)
    throws IllegalArgumentException, IllegalStateException, EJBException;
  public Timer createTimer(long initial, long duration, Serializable info
    WLTimerInfo wlTimerInfo)
    throws IllegalArgumentException, IllegalStateException, EJBException;
  public Timer createTimer(long duration, Serializable info,
    WLTimerInfo wlTimerInfo)
    throws IllegalArgumentException, IllegalStateException, EJBException;
}

例4-6 weblogic.ejb.WLTimerInfoインタフェース

public final interface WLTimerInfo {
  public static int REMOVE_TIMER_ACTION  = 1;
  public static int DISABLE_TIMER_ACTION = 2;
  public static int SKIP_TIMEOUT_ACTION  = 3;
  /**
   * Sets the maximum number of retry attempts that will be
   * performed for this timer.  If all retry attempts
   * are unsuccesful, the timeout failure action will
   * be executed.
   */
  public void setMaxRetryAttempts(int retries);
  public int getMaxRetryAttempts();
  /**
   * Sets the number of milliseconds that should elapse
   * before any retry attempts are made.
   */
  public void setRetryDelay(long millis);
  public long getRetryDelay();
  /**
   * Sets the maximum number of timeouts that can occur
   * for this timer.  After the specified number of
   * timeouts have occurred successfully, the timer
   * will be removed.
   */
  public void setMaxTimeouts(int max);
  public int getMaxTimeouts();
/**
   * Sets the action the container will take when ejbTimeout
   * and all retry attempts fail.  The REMOVE_TIMER_ACTION,
   * DISABLE_TIMER_ACTION, and SKIP_TIMEOUT_ACTION fields
   * of this interface define the possible values.
   */
  public void setTimeoutFailureAction(int action);
  public int getTimeoutFailureAction();
}

例4-7 weblogic.ejb.WLTimerインタフェース

public interface WLTimer extends Timer {
  public int getRetryAttemptCount();
  public int getMaximumRetryAttempts();
  public int getCompletedTimeoutCount();
}

タイマー・デプロイメント記述子

タイマーに関連するデプロイメント記述子の要素は以下のとおりです。


表4-3 タイマー・デプロイメント記述子

要素 説明

timer-descriptor

EJBタイマー・オブジェクト。

timer-implementation

EJBタイマー・サービスのクラスタ化の有無。クラスタ化されたEJBタイマー・サービスについては、「クラスタ化されたEJBタイマーの構成」を参照してください

persistent-store-logical-name

WebLogic Serverがタイマー・オブジェクトを格納する、サーバーのファイル・システム上の永続ストアの名前。


これらの要素の詳細については、「weblogic-ejb-jar.xmlデプロイメント記述子のリファレンス」を参照してください

クラスタ化されたEJBタイマーの構成

注意:

クラスタ化されたEJBタイマーの利点については、「クラスタ化されたEJBタイマー・サービスとローカルEJBタイマー・サービス」を参照してください

EJBタイマーのクラスタ化を構成するには、次の手順に従います。

  1. 以下について構成したかどうかを確認します。
    • クラスタ化ドメイン。詳細は、Oracle WebLogic Serverクラスタの管理のWebLogicクラスタの設定を参照してください。

    • ジョブ・スケジューラの以下の機能。

      • HAデータベース(Oracle、DB2、Informix、MySQL、Sybase、MSSQLなど)。

      • config.xmlファイルの<data-source-for-job-scheduler>要素を使用してHAデータベースにマップされているJDBCデータ・ソース。

      • リース・サービス。デフォルトでは、データベース・リースが使用され、config.xmlファイルの<data-source-for-job-scheduler>要素によって定義されたJDBCデータ・ソースが使用されます。

    ジョブ・スケジューラの構成の詳細は、『Oracle WebLogic Server CommonJアプリケーションの開発』のタイマーおよびワーク・マネージャAPIに関する項を参照してください。

  2. クラスタ化EJBタイマー・サービスを有効にするために、weblogic-ejb-jar.xmlデプロイメント記述子のtimer-implementation要素をClusteredに設定します。
    <timer-implementation>Clustered</timer-implementation>
    

    詳細は、「timer-implementation」を参照してください

クラスタ化されたEJBタイマー・サービスでは、以下のように動作が変更されることに注意してください。

  • weblogic.ejb.WLTimer*インタフェースは、クラスタ化されたEJBタイマー・サービスではサポートされません。

  • createTimer()メソッドを使用してクラスタ化されたEJBタイマーを新しく作成する場合、タイマーの初期セット・アップ時にタイムアウトの実行が遅延する場合があります。

  • ジョブ・スケジューラでは、「少なくとも1回」の実行が保証されます。クラスタ化されたEJBタイマーが期限切れになった場合、データベースはリスナー・コールバック・メソッドが完了するまで更新されません。データベースが更新される前にサーバーがクラッシュした場合、タイマーはもう一度実行されます。

  • クラスタ化されたEJBタイマー・サービスでは、障害が発生した場合に実行するアクションに関するタイマーの構成オプションは使用できません。これらの構成オプションには、再試行の遅延、再試行の最大数、タイムアウトの最大数、およびタイムアウト・エラー・アクションがあります。

  • ジョブ・スケジューラは、期限切れになるタイマーを識別するために30秒ごとにデータベースに対して問合せを実行します。30秒未満の間隔でタイマーの実行が遅延する場合があります。

  • 障害が発生した場合、トランザクション対応のタイマーのみ再試行されます。

  • タイマー実行の固定間隔スケジューリングはサポートされません。

Webサービスの参照の宣言

このリリースのWebLogic Serverは、外部のWebサービスの宣言およびアクセスに関するEJB 2.1の要件を満たしています。Webサービスの参照をEJBのデプロイメント記述子で宣言することによって、Webサービスの論理名が実際のWebサービス・インタフェースにマップされます。これにより、論理名を使用してWebサービスを参照できるようになります。さらに、BeanコードはWebサービスの参照名を使用してJNDIルックアップを実行します。

詳細は、『Oracle WebLogic Server JAX-WS Webサービスの開発』を参照してください。

Javaソースをコンパイルする

コンパイル・プロセスをサポートしているツールを確認するには、表4-1を参照してください。

コンパイル・プロセスについては、『Oracle WebLogic Serverアプリケーションの開発』を参照してください。

デプロイメント記述子を生成する

Beanのクラス・ファイルにJDK 1.5のアノテーションを追加すると、EJBGenを使用してEJBアプリケーションのリモート・クラス、ホーム・クラス、およびデプロイメント記述子ファイルを生成できます。

デプロイメント記述子の生成には、EJBGenを使用することをお薦めします。詳細は、「EJBGenリファレンス」を参照してください。

デプロイメント記述子を編集する

ejb-jar.xmlweblogic-ejb-jar.xml、およびweblogic-cmp-jar.xml (コンテナ管理による永続性エンティティBeanの場合)の要素は、アプリケーションの実行時の特性を制御します。

記述子要素を修正する必要がある場合は、任意のテキスト・エディタを使用して記述子ファイルを編集できます。ただし、エラーを防止するために、XML編集用に設計されたツールを使用してください。WebLogic Server管理コンソールで編集できる記述子要素については、表4-1を参照してください。

以下の節では、WebLogic Server固有のデプロイメント要素を簡単に参照できます。各節では、特定のタイプの機能または動作に関連する要素が取り上げられています。各節の表では、制御する動作、関連するBeanタイプ(Beanタイプ固有の場合)、その要素が含まれるweblogic-ejb-jar.xmlの親要素、およびweblogic-ejb-jar.xmlで明示的に指定しない場合に予想される動作に基づいて関連要素が定義されています。

各記述子ファイルの要素、定義、および使用例の包括的なドキュメントについては、以下を参照してください。

セキュリティ要素

この表は、セキュリティに関連するweblogic-ejb-jar.xmlの要素を示しています。


表4-4 weblogic-ejb-jar.xmlのセキュリティ要素

要素 説明 デフォルト値

security-role-assignment

ejb-jar.xmlファイルのセキュリティ・ロールをWebLogic Serverのセキュリティ・プリンシパルの名前にマッピングします。

ejb-jar.xmlがアプリケーション・ロールを定義する場合に必須。

なし

security-permission

このEJBに付与される追加のJavaセキュリティ権限。

なし

run-as-principal-name

ejb-jar.xmlsecurity-identity run-as-role-nameを指定したBeanのrun-asプリンシパルとして使用されるセキュリティ・プリンシパル名。

なし

iiop-security-descriptor

RMI-IIOPプロトコルを使用するBeanのセキュリティ・オプション。

なし


リソース・マッピング要素

この表は、ソース・コードで使用されるBeanまたはリソースの名前をデプロイメント環境のJNDI名にマッピングするweblogic-ejb-jar.xmlの要素を示しています。


表4-5 weblogic-ejb-jar.xmlのリソース・マッピング要素

要素 Beanタイプ 説明 デフォルト値

jndi-name

すべて

WebLogic Serverのリソースまたは参照のJNDI名。

注意 : JNDI名をBeanに割り当てるのは推奨されません。グローバルJNDI名は、クラスタ化サーバーの起動時に大量のマルチキャスト・トラフィックを引き起こします。より適切なプラクティスについては、「EJBリンクの使用」を参照してください。

なし

local-jndi-name

すべて

Beanのローカル・ホームのJNDI名。Beanがリモート・ホームとローカル・ホームを持つ場合は、それぞれのホームに1つずつのJNDI名を指定する必要があります。

なし

concurrency-strategy

MDB

キューおよびトピックの作成にBeanが使用するJMS接続ファクトリのJNDI名。

weblogic.jms.Message.DrivenBeanConnectionFactory

destination-jndi-name

MDB

JNDIツリーでメッセージドリブンBeanとキューまたはトピックを関連付けるJNDI名。

なし

initial-context-factory

MDB

接続ファクトリの作成にEJBコンテナが使用する初期コンテキスト・ファクトリ。

weblogic.jndi.WLInitial.Context.Factory

jms-client-id

MDB

恒久サブスクライバ・トピックと関連付けられたメッセージドリブンBeanのクライアントID。

ejb-nameの値

message-destination-descriptor

MDB

ejb-jar.xmlファイル内のメッセージ宛先の参照を、WebLogic Serverの実際のメッセージ宛先(JMSキュー、トピックなど)にマップします。

なし

provider-url

MDB

InitialContextで使用されるURLプロバイダを指定します。

t3://localhost:7001


永続性要素

この表は、Beanの状態がどのように保持されるのかを指定するweblogic-ejb-jar.xmlの要素を示しています。


表4-6 weblogic-ejb-jar.xmlの永続性要素

要素 Beanタイプ 説明 デフォルト値

type-identifier

エンティティ

EJBの永続性タイプを指定します。WebLogic Server RDBMSベースの永続性では、WebLogic_CMP_RDBMSという識別子を使用します。

なし

type-storage

エンティティ

この永続性タイプのデータを格納するファイルのパスを、EJBのデプロイメントJARファイルまたはデプロイメント・ディレクトリの最上位を基準にして定義します。

WebLogic Server RDBMSベースの永続性では通常、Beanの永続性データを格納するのにweblogic-cmp-jar.xmlというXMLファイルを使用します。このファイルは、JARファイルのMETA-INFサブディレクトリにあります。

なし

type-version

エンティティ

type-identifierで指定された永続性タイプのバージョン。WebLogic 2.0 CMPの永続性の場合は、値2.0を使用します。

WebLogic 1.1 CMPの永続性の場合は、値1.1を使用します。

なし

delay-updates-until-end-of-tx

エンティティ

trueの場合、EJBコンテナはトランザクションが終わるまでBeanの状態の更新をデータベースに書き込むのを遅らせようとします。ただしコンテナは、問合せのinclude-updates要素(weblogic-cmp-jar.xmlweblogic-query要素)がtrueの場合はEJBファインダまたはselect問合せを実行する前にデータベースに更新をフラッシュします。

コンテナ管理による永続性BeanとBean管理による永続性Beanの両方に適用可能。

True

finders-load-bean

エンティティ

finderまたはejbSelectメソッドで返されたBeanがメソッドの復帰前に直ちにキャッシュにロードされるようにします。

注意: コンテナ管理による永続性Beanでのみ適用可能。

True

persistent-store-dir

ステートフル・セッション

パッシブ化されたステートフル・セッションBeanのインスタンスの状態が格納されるディレクトリ。

pstore

is-modified-method-name

エンティティ

Beanが変更されていて、その変更をデータベースに書き込む必要があるかどうかを判断するためにコンテナから呼び出されるメソッド。

Bean管理による永続性BeanまたはEJB 1.1コンテナ管理による永続性Beanに適用されます。

指定しないと、Beanの状態は各メソッドの完了後に保持されることになります。


クラスタ化要素

この表は、クラスタ化に関連するweblogic-ejb-jar.xmlの要素を示しています。これらの要素は、WebLogic Serverクラスタのクラスタ化されたBeanのフェイルオーバーおよびロード・バランシング動作を制御します。


表4-7 weblogic-ejb-jar.xmlのクラスタ化要素

要素 Beanタイプ 説明 デフォルト値

home-call-router-class-name

ステートフル・セッション

ステートレス・セッション

エンティティ

ホーム・メソッド呼出しのルーティングに使用するカスタム・クラス。このクラスはweblogic.rmi.extensions.CallRouter()を実装する必要があります。

なし

home-is-clusterable

ステートフル・セッション

ステートレス・セッション

エンティティ

Beanのホームがクラスタ化できるかどうかを示します。

True

home-load-algorithm

ステートフル・セッション

ステートレス・セッション

エンティティ

Beanホームのレプリカ間でロード・バランシングを行うためのアルゴリズム。

weblogic.cluster.defaultLoadAlgorithmの値

idempotent-methods

ステートレス・セッション

エンティティ

クラスタ化されたEJBの多重呼出し不変メソッド。多重呼出し不変のメソッドは、ネガティブな副作用なしに繰り返すことができます。

ステートレス・セッションBeanのホームおよび読取り専用エンティティBeanインスタンスのメソッドは、明示的に指定する必要はありません。それらのメソッドは自動的に多重呼出し不変として設定されます。

なし

replication-type

ステートフル・セッション

クラスタのステートフル・セッションBeanに使用するレプリケーションを示します(in-memoryまたはnone)。

none

stateless-bean-call-router-class-name

ステートレス・セッション

Beanメソッド呼出しのルーティングに使用するカスタム・クラス。

なし

stateless-bean-is-clusterable

ステートレス・セッション

Beanがクラスタ化できるかどうかを示します。

ejb-jar.xmlでsession-typeがStatelessになっているセッションBeanでのみ使用します。

True

stateless-bean-load-algorithm

ステートレス・セッション

Beanのレプリカ間でロード・バランシングを行うためのアルゴリズム。

weblogic.cluster.defaultLoadAlgorithmプロパティの値

use-serverside-stubs

ステートレス・セッション

Beanホームがサーバー・コンテキストでサーバー・サイド・スタブを使用するようにします。

False


データの一貫性要素

この表は、Beanインスタンスのデータとデータベースの一貫性に関連するweblogic-ejb-jar.xmlの要素を示しています。これらの要素は、Beanインスタンスの値を反映して、いつどのようにデータベースが更新されるのかなどの動作を制御します。

注意:

コンテナ管理による永続性に関連する要素については、「エンティティBeanのプールとキャッシュの管理」を参照してください


表4-8 weblogic-ejb-jar.xmlのデータ一貫性要素

要素 Beanタイプ 説明 デフォルト値

concurrency-strategy

エンティティ

エンティティBeanへの同時アクセスがどのように管理されるのか。

データベース

invalidation-target

エンティティ

このコンテナ管理による永続性エンティティBeanが変更されたときに無効化する読取り専用エンティティBean。

注意 : EJB 2.x CMP Beanにのみ適用できます。

なし

delay-updates-until-end-of-tx

エンティティ

trueの場合、EJBコンテナはトランザクションが終わるまでBeanの状態の更新をデータベースに書き込むのを遅らせようとします。ただしコンテナは、問合せのinclude-updates要素(weblogic-cmp-jar.xmlweblogic-query要素)がtrueの場合はEJBファインダまたはselect問合せを実行する前にデータベースに更新をフラッシュします。

コンテナ管理による永続性BeanとBean管理による永続性Beanの両方に適用可能。

True


コンテナ管理によるトランザクション要素

表4-9は、コンテナ管理によるトランザクションに関連するejb-jar.xmlの要素を示しています。


表4-9 ejb-jar.xmlのコンテナ管理によるトランザクション要素

要素 説明 デフォルト値

transaction-type

値はBeanまたはContainerのいずれか。

なし。EJB 2.xではこの属性の指定は必須となっています。

trans-attribute

メソッドの呼出しをエンタープライズBeanのビジネス・メソッドに委託するときにコンテナがトランザクションの境界をどのように管理するのかを指定します。有効な値は以下のとおりです:

  • NotSupported

    値がNotSupportedの場合、エンティティBeanが指定されていないトランザクションで実行されており、トランザクションが存在するとき、EJBコンテナはトランザクションを中断します。エンティティBeanが指定されていないトランザクションで実行され、トランザクションが存在しない場合、EJBコンテナはアクションを実行しません。

  • Supports

    値がSupportsの場合、エンティティBeanが指定されていないトランザクションで実行されており、トランザクションが存在するとき、EJBコンテナは現在のトランザクションを使用します。エンティティBeanが指定されていないトランザクションで実行され、トランザクションが存在しない場合、EJBコンテナはアクションを実行しません。

  • Required

  • RequiresNew

  • Mandatory

  • Never

    値がNeverの場合、エンティティBeanが指定されていないトランザクションで実行されており、トランザクションが存在するとき、EJBコンテナは例外を送出します。エンティティBeanが指定されていないトランザクションで実行され、トランザクションが存在しない場合、EJBコンテナはアクションを実行しません。

注意 : 9.0より前のリリースのWebLogic Serverでは、EJBコンテナは、トランザクションが存在せず、trans-attributeの値がNotSupportedSupports、およびNeverの場合、新しいトランザクションを開始した。EJBコンテナを9.0より前のリリースのWebLogic Serverと同じように動作させて新しいトランザクションを作成する場合は、weblogic-ejb-jar.xmlentity-always-uses-transactionTrueに設定します。

クライアントはMDBの呼出しでトランザクション・コンテキストを提供しないので、コンテナ管理によるトランザクションを使用するMDBではtrans-attributeRequiredでなければなりません。

指定しないと、EJBコンテナは警告を発し、MDBではNotSupported、それ以外のEJBではSupportsを使用します。

transaction-scope

この省略可能な要素は、エンタープライズBeanがそのメソッドで分散トランザクションを必須とするかどうか、またはローカル・トランザクションの最適化を使用できるかどうかを指定します。

値はLocalDistributedのいずれか。

指定しない場合、コンテナは分散トランザクションが使用されなければならないものと想定します。


表4-10は、コンテナ管理によるトランザクションに関連するweblogic-ejb-jar.xmlの要素を示しています。


表4-10 weblogic-ejb-jar.xmlのコンテナ管理によるトランザクション要素

要素 説明 デフォルト値

retry-methods-on-rollback

ここで指定したメソッドに対して、EJBコンテナはロールバックされたコンテナ管理によるトランザクションを自動的に再試行します。

注意: この要素で指定されたメソッドに関わらず、EJBコンテナは、システム例外に基づくエラーが原因で失敗したトランザクションは再試行しません。

なし

transaction-isolation

メソッドがトランザクションを開始するときに使用するトランザクション・アイソレーション・レベル。指定されたトランザクション・レベルは、メソッドが既存のトランザクションを継承する場合は使用されません。

基底のDBMSのデフォルト

trans-timeout-seconds

トランザクションの最長継続時間。

なし


パフォーマンス要素

この表は、パフォーマンスに関連するweblogic-ejb-jar.xmlの要素を示しています。


表4-11 weblogic-ejb-jar.xmlのパフォーマンス要素

要素 Beanタイプ 説明 デフォルト値

allow-concurrent-calls

ステートフル・セッション

Remote Exceptionが送出されることなく、複数のクライアントがBeanに同時にアクセスできるかどうか。

ステートフル・セッションBeanインスタンスによるメソッド呼出しの処理中に、同時に他のメソッド呼出しがサーバーに送信されたときに、サーバーはRemoteExceptionを送出します。

False

cache-between-transactions

エンティティ

コンテナがトランザクション間でエンティティBeanの永続データをキャッシュするようにします。

False

cache-type

ステートフル・セッション

ステートフル・セッションBeanがキャッシュから削除される順序。

NRU

(最近未使用)

clients-on-same-server

すべて

Beanのすべてのクライアントが同じサーバー・インスタンス上でそのBeanと連結されていることを示します。この要素は、EJBにグローバルJNDI名がある場合のみ使用します。trueに設定すると、JNDI名がレプリケートされません。

値をtrueにすると、大規模なクラスタで開始時間を短縮できます。

False

delay-updates-until-end-of-tx

エンティティ

trueの場合、EJBコンテナはトランザクションが終わるまでBeanの状態の更新をデータベースに書き込むのを遅らせようとします。

ただしコンテナは、問合せのinclude-updates要素(weblogic-cmp-jar.xmlweblogic-query要素)がtrueの場合はEJBファインダまたはselect問合せを実行する前にデータベースに更新をフラッシュします。

コンテナ管理による永続性BeanとBean管理による永続性Beanの両方に適用可能。

True

dispatch-policy

すべて

Beanへの要求を処理するために使用するスレッド・プールを指定します。

なし

entity-cache-name

エンティティ

アプリケーション・レベルのエンティティ・キャッシュ。同じアプリケーションに属する複数のエンティティBeanのインスタンスをキャッシュできます。

注意: アプリケーション・レベルのキャッシュはweblogic-application.xmlで宣言します。

なし

estimated-bean-size

エンティティ

エンティティBeanのインスタンスの推定平均サイズ(バイト単位)。

なし

finders-load-bean

エンティティ

finderまたはejbSelectメソッドで返されたBeanがメソッドの復帰前に直ちにキャッシュにロードされるようにします。

注意: コンテナ管理による永続性Beanでのみ適用可能。

True

idle-timeout-seconds

エンティティ

Beanがパッシブ化されるまでの活動のない状態の秒数。

注意: この要素は現在は使われていません。

600

idle-timeout-seconds

ステートフル・セッション

Beanがパッシブ化されるまでの活動のない状態の秒数。

600

initial-beans-in-free-pool

エンティティ

メッセージドリブン

ステートレス・セッション

起動時にコンテナによってインスタンス化されるEJBのインスタンスの数。

0

is-modified-method-name

エンティティ

Beanの状態を変更するメソッド。このメソッドを指定すると、WebLogic serverはメソッドの完了時にBeanの状態を保持します。

注意 : Bean管理による永続性BeanまたはEJB 1.1コンテナ管理による永続性Beanに適用されます。

指定しないと、Beanの状態は各メソッドの完了後に保持されることになります。

jms-polling-interval-seconds

メッセージドリブン

アクセスできなくなっているJMS宛先にEJBコンテナが再接続しようとする試みの秒間隔。

10

max-beans-in-cache

エンティティ

ステートフル・セッション

キャッシュ内のインスタンスの最大数。

1000

max-beans-in-free-pool

エンティティ

ステートレス・セッション

メッセージドリブン

フリー・プールのインスタンスの最大数。

1000

read-timeout-seconds

エンティティ

読取り専用エンティティBeanでejbLoadを呼び出す間隔の秒数。read-timeout-secondsが0の場合、ejbLoadはBeanがキャッシュされた場合のみ呼び出されます。

600


ネットワーク通信要素

この表は、ネットワーク通信に関連するweblogic-ejb-jar.xmlの要素を示しています。


表4-12 weblogic-ejb-jar.xmlの通信要素

要素 Beanタイプ 説明 デフォルト値

network-access-point

すべて

EJBにカスタム・ネットワーク・チャネルを割り当てます。

なし


EJBラッパー・クラスとスタブおよびスケルトン・ファイルを生成する

コンテナ・クラスには、WebLogic Serverが使用するEJBの内部表現に加えて、クライアントが使用する外部インタフェース(ホーム、ローカル、またはリモート)の実装も格納されます。コンテナ・クラスを生成するには、Oracle Workshop for WebLogic Platformまたはappcを使用します。

コンテナ・クラスは、weblogic-ejb-jar.xmlの記述子要素に従って生成されます。たとえば、クラスタ化要素を指定すると、appcはデプロイメントで使用されるクラスタ対応クラスを作成します。appcは、必要なオプションと引数を指定することでコマンド・ラインから直接使用できます。詳細については、「appc」を参照してください。

次の図は、EARまたはJARファイルの作成時にデプロイメント・ユニットに追加されるコンテナ・クラスを示しています。

図4-2 EJBコンテナ・クラスの生成

図4-2の説明が続きます
「図4-2 EJBコンテナ・クラスの生成」の説明

appcと生成されたクラス名の衝突

まれなことではありますが、appcでクラス名を生成したとき、生成したクラス名の衝突に遭遇し、これがClassCastExceptionや他の例外を招くことがあります。これは、生成されるクラス名が、Beanクラス名、Beanクラス・パッケージ、そのBeanのejb-nameの3つのキーを基にしているためです。この問題が起こるのは、複数のJARファイルを含むEARファイルを使用し、その2つ以上のJARファイルのそれぞれにBeanクラス、パッケージ、または、クラス名を同じくするEJBが含まれ、双方のEJBがそれぞれのJARファイル内で同じejb-nameを持っている場合です。この問題が発生した場合は、いずれかのBeanのejb-nameをユニークなものに変更してください。

ejb-nameはファイル名の基となるキーの1つであり、ejb-nameはJARファイル内でユニークでなければならないので、同じJARファイルにある2つのEJB間ではこの問題は起きません。また、EARファイルではファイルごとに個別のクラスローダーになるため、別々のEARファイルに置かれた2つのEJB間でこの問題は起きません。

パッケージ化する

EJBをエンタープライズ・アプリケーションの一部としてパッケージ化することをお薦めします。詳細は、Oracle WebLogic Serverアプリケーションの開発の分割開発ディレクトリからのデプロイとパッケージ化を参照してください。

クライアントが他のアプリケーションにあるEJBのパッケージ化の考慮事項

WebLogic Serverでは、別のアプリケーションのプログラムに基づくクライアントがEJBへのアクセスに必要とするEJBクラスをパッケージ化するためのejb-client.jarファイルの使用がサポートされています。

Beanのejb-jar.xmlファイルのejb-client-jar要素でクライアントJARの名前を指定します。appcコンパイラを実行すると、EJBにアクセスするために必要なクラスを持つJARファイルが生成されます。

クライアントJARをリモート・クライアントからアクセスできるようにします。Webアプリケーションの場合は、ejb-client.jar/libディレクトリに配置します。非Webクライアントの場合は、クライアントのクラスパスでejb-client.jarを指定します。

注意:

WebLogic Serverのクラスローディング動作は、クライアントがスタンドアロンかどうかによって異なります。ejb-client.jarにアクセスできるスタンドアロンのクライアントは、ネットワーク経由で必要なクラスをロードできます。ただし、セキュリティ上の理由から、サーバー・インスタンスで動作しているプログラムに基づくクライアントはネットワーク経由でクラスをロードすることはできません。

デプロイ

EJBをデプロイすると、WebLogic ServerはEJBのコンポーネントをクライアントに提供できるようになります。EJBは、ユーザーの環境とEJBが本番環境に置かれるかどうかに基づいて、複数の手順のうちの1つでデプロイできます。

WebLogic Serverアプリケーションおよびモジュール(EJBを含む)をデプロイする一般的な手順については、『Oracle WebLogic Serverへのアプリケーションのデプロイ』を参照してください。EJB固有のデプロイメントの問題と手続きについては、このドキュメント『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』「Enterprise JavaBeansのデプロイメント・ガイドライン」を参照してください。

開発時に問題を解決する

以降の節では、デプロイしたEJBのチェックとデバッグに便利なWebLogic Serverの機能を説明します。

行番号をクラス・ファイルに追加する

appcでEJBをコンパイルする場合は、appc -lineNumbersコマンド・オプションを使用して、デバッグしやすいように生成したクラス・ファイルに行番号を追加できます。詳細は、「appcリファレンス」参照してください。

データをモニターする

WebLogic Serverは、デプロイされたEJBの実行時の処理についてさまざまなデータを収集します。このデータは、WebLogic Server管理コンソールの「デプロイメント」ノードで表示でき、EJBが目的の処理ステップを完了しているかどうかを判断する上で便利です。EJBの実行時の統計を表示するには、WebLogic Server管理コンソールで「デプロイメント」ノードを展開し、そのBeanが含まれているJAR EARを見つけて「モニタリング」タブを選択します。

参照できるデータについては、Oracle WebLogic Server管理コンソール・オンライン・ヘルプにある次のページを参照してください。

デバッグ・メッセージを作成する

バグや問題のトラブルシューティングおよび解決に役立つメッセージをアプリケーションで作成する手順については、『Oracle WebLogic Serverログ・ファイルの構成とログ・メッセージのフィルタ処理』を参照してください。

EJBを開発するためのWebLogic Serverツール

この節では、EJB開発プロセスをサポートするOracleのツールについて説明します。各ツールの機能の比較については、表4-14を参照してください。

Oracle JDeveloper

Oracle JDeveloperは、EJBのエンドツーエンドの開発に使用できるフル機能のJava IDEです。詳細については、Oracle JDeveloperのオンライン・ヘルプを参照してください。JDeveloperのインストールについては、『Oracle JDeveloperのインストール』を参照してください

Oracle Enterprise Pack for Eclipse

Oracle Enterprise Eclipse (OEPE) - WebLogic Webサービスの開発を容易にするEclipse IDEプラットフォームのプラグイン群を提供します。詳細については、Eclipse IDEプラットフォームのオンライン・ヘルプを参照してください。

管理コンソール

WebLogic Server管理コンソールでは、多くのデプロイメント記述子要素について表示、修正、およびEJB内の記述子ファイルへの保持を行うことができます。記述子は、EJBの管理サーバー・コピー、ならびにEJBのすべてのデプロイされたコピー(デプロイ後)において、修正されます。記述子を修正した場合、変更はユーザーのEJBのオリジナル・コピー(デプロイ前)に対して行われます。

ただし、これらの記述子要素の更新は、EJBを再デプロイする必要なしに、実行時に動的に行われます。WebLogic Server管理コンソールで変更できる記述子要素は、表4-13にまとめられているように、実行時に動的に変更できるものに限定されています。


表4-13 管理コンソールからアクセスできる記述子要素

EJBタイプ 編集可能な要素

エンティティ

メッセージドリブン

ステートレス

ステートフル


javac

Java SE JDKに付属のjavacコンパイラは、javaコンパイル機能を提供します。javacの詳細は、http://www.oracle.com/technetwork/java/index-jsp-142903.html#documentationを参照してください。

EJBGen

EJBGenは、EJB 2.xのコード・ジェネレータです。Beanクラス・ファイルにjavadocタグでアノテーションを付けた後、EJBGenを使用してEJBアプリケーションのリモート・インタフェース・クラス、ホーム・インタフェース・クラス、および、デプロイメント記述子ファイルを生成することができるので、編集および管理すべきEJBファイルの数を1つに減らせます。

デプロイメント記述子の生成には、EJBGenの使用をお薦めします; これは、EJBの維持を容易化および簡略化できる、Oracleのベスト・プラクティスです。EJBGenを使用する場合、記述してアノテーションを付ける必要があるBeanクラスは1つだけです。そのため、記述、デバッグ、および維持が簡略化されます。開発環境としてOracle Workshop for WebLogic Platformを使用すると、EJBGenタグが自動挿入されます。

EJBGenの詳細は、「EJBGenリファレンス」を参照してください。

DDInit

DDInitは、WebLogic Serverアプリケーションのデプロイメント記述子を生成するためのユーティリティです。DDInitでは、クラス・ファイルからの情報に基づいてデプロイメント記述子ファイルを作成します。

Oracle WebLogic Serverコマンド・リファレンスのDDInitを参照してください。

WebLogic Server Antユーティリティ

WebLogic Serverには、スケルトン・デプロイメント記述子を作成するためのAntユーティリティが用意されています。

このAntタスクは、EJBを含むディレクトリを検証し、そのディレクトリの内容に基づいてデプロイメント記述子を作成します。Antユーティリティは、個別のEJBに必要な構成やマッピングに関する情報をすべて保持しているわけではないので、Antユーティリティによって作成されるスケルトン・デプロイメント記述子は不完全なものです。このユーティリティがスケルトン・デプロイメント記述子を作成した後で、テキスト・エディタやXMLエディタを使ってデプロイメント記述子を編集し、EJBの構成を完全なものにしてください。

詳細は、Oracle WebLogic Serverアプリケーションの開発のwldeployを使用したアプリケーションのデプロイを参照してください。

weblogic.Deployer

weblogic.Deployerコマンド・ライン・ツールは、WebLogic ServerデプロイメントAPIにコマンド・ライン・インタフェースを提供する、Javaベースの開発ツールです。このツールは、コマンド・ライン、シェル・スクリプト、またはJava以外の自動化された環境からデプロイメントを開始する必要がある管理者および開発者向けに開発されました。

Oracle WebLogic Serverへのアプリケーションのデプロイのweblogic.Deployerコマンドライン・リファレンスを参照してください。

appc

appcコンパイラは、EJBおよびJSPをWebLogic Serverにデプロイするのに必要なクラスを生成し、コンパイルします。それは、個別のモジュール・レベルとアプリケーション・レベルの両方で、現在の仕様に準拠しているかどうかデプロイメント記述子を検証します。アプリケーション・レベルのチェックでは、個別のモジュールに対するアプリケーション・レベルのデプロイメント記述子のチェックと、モジュール全体の検証チェックが行われます。

注意:

appcは、非推奨のejbcユーティリティの後継ツールです。ejbcではなくappcを使用することをお薦めします。

「appcリファレンス」を参照してください。

DDConverter

DDConverterは、WebLogic Serverの旧リリースのデプロイメント記述子をアップグレードするコマンド・ライン・ツールです。最新のJava EE仕様とWebLogic Serverリリースの機能を活用するために、常にデプロイメント記述子をアップグレードすることをお薦めします。

weblogic.DDConverterを使用すると、デプロイメント記述子をアップグレードできます。weblogic.DDConverterの使い方については、『Oracle WebLogic Serverアプリケーションの開発』を参照してください。

注意:

このリリースのWebLogic Serverでは、EJB固有のDDConverterであるweblogic.ejb20.utils.DDConverterは非推奨になっています。使用しているアプリケーションのデプロイメント記述子(EJB固有のデプロイメント記述子を含む)を変換するには、アプリケーション・レベルの新しいDDConverterであるweblogic.DDConverterを使用してください。

EJBツールの機能の比較

次の表はEJB開発のOracleツールと、各ツールの機能を示しています。は、そのツールが対応する機能を備えていることを示します。


表4-14 EJBツールとその機能

EJBツール インタフェースおよびホーム・インタフェースの生成 Javaコードのコンパイル デプロイメント記述子を生成する デプロイメント記述子の表示と編集 デプロイ

WebLogic Workshop

いいえ

appc

いいえ

いいえ

いいえ

いいえ

javac

いいえ

いいえ

いいえ

いいえ

EJBGen

いいえ

いいえ

DDInit

いいえ

いいえ

いいえ

いいえ

WebLogic Server管理コンソール

いいえ

いいえ

いいえ

Deployer

いいえ

いいえ

いいえ

いいえ

DDConverter

いいえ

いいえ

いいえ

いいえ