ヘッダーをスキップ
Oracle Containers for J2EEサービス・ガイド
10g(10.1.3.5.0)
B56027-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

9 アプリケーション・クライアント・コンテナの使用方法

この章では、アプリケーション・クライアント開発の基本的な要件、およびOracleアプリケーション・クライアント・コンテナの使用方法を説明します。この章には、次の項目が含まれます。

アプリケーション・クライアントを開発する場合、およびアプリケーション・クライアント・コンテナを使用する場合、ユーザーはJNDIおよびRMIを理解している必要があります。これらの項目は、このマニュアルのそれぞれに関連する章で説明されています。

アプリケーション・クライアント・コンテナのタスク

この章では、次のタスクを説明します。

追加ドキュメント

OC4JのサイトにあるHow-Toドキュメントでは、OC4Jの機能に関する追加情報(EJBの例など)を提供しています。例には、アプリケーション・クライアント・コンテナの機能を示すアプリケーション・クライアントが含まれています。

http://www.oracle.com/technology/tech/java/oc4j/index.html

コンテナの概要

WebコンテナやEJBコンテナとは違い、アプリケーション・クライアント・コンテナは軽量のJ2EEコンテナで、クライアント・コンピュータで稼働します。アプリケーション・クライアント・コンテナは、アプリケーション・クライアントと呼ばれるアプリケーション・コンポーネントのホスティングに使用されます。リモートのJ2EEサーバーにあるリソースおよび機能へのアクセスを提供する際にアプリケーション・クライアント・コンテナに依存すること以外、アプリケーション・クライアントは、スタンドアロンのJava2 SEアプリケーションに似ています。実際的な面から見ると、アプリケーション・クライアント・コンテナを使用することにより、開発者は、データソースまたはEJBなどのJ2EEリソースに対するアクセス権も持つ、堅牢なスタンドアロンのJavaアプリケーションを作成できます。図9-1に、アプリケーション・クライアント・コンテナ、アプリケーション・クライアントおよびリモートのJ2EEリソースの概念図を示します。

図9-1 アプリケーション・クライアント・コンテナの概念図

アプリケーション・クライアント・コンテナの概念図を示します。

Oracleアプリケーション・クライアント・コンテナには、JNDIおよびRMIの実装が含まれます。実行時、コンテナはJNDIを使用して初期コンテキスト・ファクトリおよびRMIを作成し、クライアントに必要なリモート・リソースを取得します。

JNDIのサポート

アプリケーション・クライアント・コンテナでは、JNDIを使用してリモートのOracle Application Serverでホスティングされているリソースをルックアップできます。アプリケーション・クライアントのメイン・クラスにリソースが自動的に挿入されるようにするための注釈や、JNDIルックアップを作成するためのJNDI APIも使用できます。JNDIを使用したことがない場合、JNDIの使用方法の詳細は第2章を参照してください。

RMIのサポート

リモート・リソースに対するすべてのリクエストは、RMIを介して実行されます。アプリケーション・クライアント・コンテナでは、ORMI、RMI/IIOPおよびORMIトンネリングを使用できます。また、OPMNを介したORMI接続もサポートされています。RMIを使用したことがない場合、RMIの使用方法の詳細は第6章を参照してください。

セキュリティのサポート

アプリケーション・クライアント・コンテナでは、カスタムのセキュリティ・コールバック・ハンドラを使用できます。カスタムのセキュリティ・コールバック・ハンドラを使用すると、カスタマイズした方法でユーザー資格証明を取得できます。

要件

アプリケーション・コンテナには、次のランタイム要件があります。

アプリケーション・クライアントの開発

この項では、アプリケーション・クライアント・コンテナ用のアプリケーション・クライアントの開発に関する基本的な内容を説明します。一般的に、アプリケーション・クライアントは、J2SEアプリケーションの標準構造に準拠しています。ただし、アプリケーション・クライアントでは、コンテナによって提供されるJ2EE機能も使用されます。

メイン・クラスの作成

アプリケーション・クライアントには、メイン・クラスとみなされるクラスがあります。メイン・クラスは、アプリケーション・クライアントの起動時のエントリ・ポイントです。このクラスには、static mainメソッドが含まれている必要があります。mainメソッドは、コンテナの初期化後に最初に起動されるメソッドです。単純なアプリケーション・クライアントでは、次のようなものを使用します。

public class Foo {
   public static void main(String[] args) {
...
   }
}

アプリケーション・クライアント・コンテナでは、起動時にアプリケーション・クライアントJARのManifest.mfファイルを使用して、アプリケーション・クライアントのメイン・クラスを検索します。クラスは、Manifest.mfファイルにMain-Class属性を定義することでメイン・クラスとして指定されます。例:

Main-Class: com.mycompany.MyMainClass

アプリケーション・クライアントJARの作成方法の詳細は、「クライアントのパッケージ化」を参照してください。

JNDIを使用したリソースへのアクセス

アプリケーション・クライアント・コンテナには、リモート・リソースにアクセスするためのJNDIサービスへのアクセス権のあるアプリケーション・クライアントが用意されています。そのため、アプリケーション・クライアントからのリソース(EJBやデータソースなど)の取得は、その他のJ2EEコンポーネントで使用されるのと同じJNDIプログラミング・モデルに従います。後続の各項では、JNDIの使用方法の概要を説明します。JNDIを使用したことがない場合、JNDIの使用方法の詳細は第2章を参照してください。


注意:

JNDIを使用してアプリケーション・クライアントからEJBリソースをルックアップする詳細な例は、第2章「J2EEアプリケーション・クライアントからのオブジェクトのルックアップ」を参照してください。また、JNDIネーミング・コンテキストで使用可能なデータソースを使用してデータベースに接続する方法の詳細は、第5章「データソースからの接続の取得」を参照してください。

注釈の使用方法

アプリケーション・クライアントのメイン・クラスでは、ネーミング・コンテキストからのリソース・インジェクションのリクエストや、ネーミング・コンテキストで必要なエントリの宣言をJava言語の注釈を使用して実行できます。注釈は、コンテナの初期化手順の一部として処理されます。コンテナを開始してアプリケーション・クライアントが起動されると、注釈は処理されません。

注釈付きのメイン・クラスのメソッドおよびフィールドは、staticである必要があります。この規則は、インジェクションをリクエストしているメソッドやフィールドをstaticにできない、典型的なJ2EEリソースとは異なります。この違いの理由は、コンテナではアプリケーション・クライアントのインスタンスが作成されないことにあります。アプリケーション・クライアント・コンテナでは、アプリケーション・クライアントJARのマニフェストに指定されているメイン・クラスをロードし、そのクラスのstatic mainメソッドを起動します。この後、アプリケーション・クライアントはJ2SEアプリケーションと同じように稼働します。

次の例では、@EJBという注釈を使用して、HelloWorldというリモートのEJBリソースへの参照を取得する方法を示します。

import javax.ejb.EJB;

public class HelloWorldClient {
   @EJB
      private static HelloWorld helloWorld;
      public  static void main(String[] args) {
         // Use the HellOWorld bean.
         ...

注意:

アプリケーション・コンポーネントごとに、サポートされる注釈タグも異なります。それぞれのコンポーネントでの注釈の使用方法の詳細は、個々のアプリケーション・コンポーネントのマニュアル(『Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド』など)を参照してください。

JNDI APIの使用方法

アプリケーション・クライアント・クラスでは、JNDI APIを使用してネーミング・コンテキストのリソースをルックアップできます。注釈とは異なり、コンテナの初期化後もJNDIルックアップを処理できます。次に、JNDI APIを使用して、前の例と同じHelloWorld EJBリソースを取得する例を示します。

import javax.naming.Context;
import javax.naming.InitialContext;

public class HelloWorldClient {
   public static void main(String[] args) {
   try {
      HelloWorld helloWorld = (HelloWorld) new InitialContext()          .lookup("java:comp/env/ejb/HelloWorld");
      // Use the HelloWorld bean.
      ...

デプロイメント・ディスクリプタの使用方法

アプリケーション・クライアントでは、アプリケーション・クライアントのデプロイメント・ディスクリプタを使用して、ネーミング・コンテキストでのエントリの宣言およびエントリのインジェクションのリクエストを実行できます。次の例では、リソース・インジェクションをリクエストする方法、およびクライアントのデプロイメント・ディスクリプタにHelloWorld EJBを宣言する方法を示します。

<application-client>   <ejb-ref>      <ejb-ref-name>com.myCompany.HelloWorldClient/helloWorld</ejb-ref-name>
      <remote>com.myCompany.HelloWorld</remote>
      <injection-target>
         <injection-target-class>
            com.myCompany.HelloWorldClient
         </injection-target-class>
         <injection-target-name>helloWorld</injection-target-name>      </injection-target>   </ejb-ref></application-client>

例では、HelloWorld Beanが、HelloWorldClientクラスのhelloWorldインスタンスに挿入されています。

アプリケーション・クライアントのデプロイメント・ディスクリプタの使用方法の詳細は、「デプロイメント・ディスクリプタの使用方法」を参照してください。

JNDIプロパティの設定

JNDIプロパティはjndi.propertiesファイルに設定されます。このファイルは、実行時のコンテナに必要です。コンテナは、このファイルを使用して初期JNDIコンテキストを作成し、リモート・リソースにアクセスするためのRMI接続設定を定義します。このファイルは、アプリケーション・クライアントJARのルートに配置する必要があります。

次の例では、スタンドアロンOC4JサーバーでホスティングされているEJBにアクセスする際に必要なプロパティを示します。

java.naming.factory.initial=oracle.j2ee.naming.    ApplicationClientInitialContextFactory
java.naming.provider.url=ormi://<host>:23791/my_ejb>
java.naming.security.principal=scott
java.naming.security.credentials=tiger

初期ファクトリは常にApplicationClientInitialContextFactoryです。また、リソースがOPMNを使用するOracle Application Serverに配置されている場合は、ネーミング・プロバイダURLの一部としてopmn:ormiプロトコルを使用します。例:

java.naming.provider.url=opmn:ormi://<host>:6003:home/my_ejb

ORMIを使用してリモート・リソースに接続する方法の詳細は、「RMI/ORMIを使用したリモート・オブジェクトのルックアップ」を参照してください。JNDIの使用方法の詳細は、第2章「JNDIの使用」を参照してください。

デプロイメント・ディスクリプタの使用方法

application-client.xmlファイルは、アプリケーション・クライアント用の標準のJ2EEデプロイメント・ディスクリプタで、アプリケーション・クライアントJARのMETA-INF/ディレクトリに配置する必要があります。このファイルは、環境エントリやアプリケーション・クライアントに必要なリソースへの参照の定義に使用されます。ただし、リソース・インジェクションを実行するために、クライアント・コードで注釈のみが使用されている場合には、このファイルは不要です。


注意:

リソース参照は、注釈を使用して定義するだけでなく、application-client.xmlファイルにも定義できます。その場合、デプロイメント・ディスクリプタは注釈よりも優先されます。

application-client.xmlファイルでは、標準のJ2EE参照要素(env-entryejb-refresource-refなど)が使用されます。デプロイメント・ディスクリプタの詳細は、J2EE仕様のアプリケーション・クライアント・コンテナに関する章を参照してください。この章には、application-client.xmlファイルの詳細な例および使用可能な要素のリストがあります。

クライアントのパッケージ化

アプリケーション・クライアントは、JARファイルとしてパッケージ化されます。アーカイブは、Javaのjarユーティリティを使用するか、類似の圧縮形式(zipなど)を使用して拡張子を.jarに変更することで作成できます。

アーカイブ・ファイルのコンテンツは、次のような標準の構造で編成されています。

/
/jndi.properties
/META-INF
/META-INF/Manifest.mf
/META-INF/application-client.xml

カスタム・セキュリティ・ハンドラの実装

アプリケーション・クライアント・コンテナは、初期JNDIコンテキストの作成時やリモート・メソッドの起動時にはリモート・サーバーに認証する必要があります。コンテナでは、JNDIプロパティ・ファイルに定義されているユーザー名、パスワードおよびプロバイダURLを使用するデフォルトのコールバック・ハンドラが使用されます。これらのプロパティの設定方法の詳細は、「JNDIプロパティの設定」を参照してください。

アプリケーション・クライアントでJAASコールバック・ハンドラを実装すると、必要な資格証明を取得するためにログイン画面を表示するなどのカスタム機能を提供できます。そのような場合、コンテナにより起動時にコールバック・ハンドラがインスタンス化され、JNDIプロパティ・ファイルに定義されている設定は無視されます。コールバック・ハンドラが失敗すると、コンテナはJNDIプロパティ・ファイルのデフォルトの設定に戻ります。

カスタム・セキュリティ・ハンドラを実装するには、次のようにします。

  1. javax.security.auth.callback.CallbackHandlerインタフェースを実装する、引数コンストラクタのないハンドラ・クラスを作成します。

  2. アプリケーション・クライアントJARファイルにコールバック・ハンドラを追加するか、実行時にCLASSPATHでハンドラが検出されることを確認します。

  3. ハンドラ・クラスへの参照をapplication-client.xmlファイルに追加します。例:

    <application-client>
       <callback-handler>
          com.myCompany.MyCallbackHandler
       </callback-handler>
    </application-client>
    

アプリケーション・クライアントの起動

アプリケーション・クライアント・コンテナは、起動時にクライアントを起動します。起動中、コンテナはまずJNDIコンテキストを作成し、定義されている任意のリモート・サーバーに接続して、クライアントがリクエストしたJ2EEリソースを取得します。クライアントは、コンテナによる初期化が完了した後にのみ起動されます。


注意:

クライアントを起動する前には、リクエストされたリソースがリモート・サーバーにデプロイされていることと、サーバーが起動されていることを確認してください。コンテナがリモート・サーバーのリソースを検出できない場合、コンテナは初期化に失敗し、クライアントも起動されません。

アプリケーション・クライアント・コンテナの起動クラス(oracle.oc4j.appclient.AppClientContainer)は、oc4jclient.jarのメイン・クラスとして設定されます。JARを使用してアプリケーション・クライアントを起動するには、コマンドラインから次のコマンドを入力します。

java -jar J2EE_HOME\oc4jclient.jar <aplication_client_jar> <arguments>

アプリケーション・クライアントJARファイルへのフルパスを指定する必要があります。また、コマンドラインで指定されたクライアント引数は、起動時にクライアントのmain()メソッドに渡され、コンテナでは処理されません。

oc4jclient.jarファイルのデフォルトの動作では、Manifest.mfファイルに定義されているCLASSPATHを使用してコンテナが起動されます。ただし、起動時にその他のライブラリまたはディレクトリが必要な場合には、アプリケーション・クライアント・コンテナの起動クラスおよびJavaの-cpオプションを使用します。例:

java -cp J2EE_HOME\oc4jclient.jar;foo.jar oracle.oc4j.appclient.AppClientContainer <aplication_client_jar> <arguments>

注意:

Javaライブラリと同様に、アプリケーション・クライアント・ライブラリでは、マニフェストにClass-Pathエントリを含めることができます。これにより、アプリケーション・クライアントのクラスパスに外部JARを追加し、詳細なクラスパス構成を提供できます。ただし、JARを使用できるのはアプリケーション・クライアントのみで、アプリケーション・クライアント・コンテナでは使用できません。