この章は、Oracle Enterprise Schedulerを使用してジョブ・リクエストを実行するアプリケーションを作成および実行する方法について説明し、Oracle Enterprise Schedulerを使用するアプリケーションをOracle JDeveloperで作成する方法を示すチュートリアルです。
次に、この章では2つの分割されたアプリケーションである、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)を使用する、サンプル・アプリケーションのバリエーションを示します。
|
注意: Oracle Enterprise Schedulerのサンプル・コードについては、サンプル・サイト( |
この章では、次の項目について説明します。
第4.1項「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」
第4.2項「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」
Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションを開発する場合は、ミドルウェア・ホームの環境変数をOracle JDeveloper自体のインストール場所に設定する必要があります。Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションの開発を始める前に、必ずこの変数を設定してください。
Oracle Enterprise Schedulerアプリケーションをビルドするための環境を設定する手順は、次のとおりです。
コマンド・プロンプトを開きます。
ディレクトリをOracle JDeveloperのインストール場所に変更します。たとえば、Windowsでは次を実行します:
>cd c:\Oracle\Middleware\jdeveloper
MW_HOMEをOracle JDeveloperの場所に設定します。次に例を示します。
>set MW_HOME=c:\Oracle\Middleware
Oracle JDeveloperを起動します。
>jdeveloper
Oracle Enterprise Schedulerアプリケーションを開発するためにOracle JDeveloperでプロジェクトを作成すると、特定のプロジェクト・テクノロジのサポートを指定することで、アプリケーション機能に対する基礎となるサポートが追加されます。
Oracle Enterprise Schedulerアプリケーションの作成の詳細は、第4.3項「組み合されたOracle Enterprise Schedulerアプリケーションのビルド」および第4.4項「分割された発行者アプリケーションおよびホスティング・アプリケーションのビルド」を参照してください。
Oracle JDeveloperを使用してアプリケーションを作成する場合は、アプリケーションのニーズに応じて、次のテクノロジから選択します。
ホスティング・アプリケーションを開発するためのESSホスト・サポート。これには次のものが含まれます。
アプリケーション・サポートのためのweblogic-application.xmlの更新。
プロジェクト・サポートのためのEJBデプロイメント・プロファイルの更新。
アプリケーション・サポートのためのEARデプロイメント・プロファイルの更新。
Oracle Enterprise Schedulerライブラリの追加。
プロジェクトへのコンテキスト・メニューの追加(プロジェクトを右クリックして「エンタープライズ・スケジューラ・プロパティ」を選択することでアクセスします)。これにより、ejb-jar.xmlプロパティ(論理アプリケーション名、アプリケーション・ポリシー・ストライプ、JPSインターセプタ・アプリケーション名)を変更することが可能になります。
クライアント・アプリケーションを開発するためのESSクライアント・サポート。これには次のものが含まれます。
アプリケーション・サポートのためのweblogic-application.xmlの更新。
プロジェクト・サポートのためのEJBデプロイメント・プロファイルの更新。
Oracle Enterprise Schedulerライブラリの追加。
プロジェクトへのコンテキスト・メニューの追加(プロジェクトを右クリックして「エンタープライズ・スケジューラ・プロパティ」を選択することでアクセスします)。これにより、ejb-jar.xmlプロパティ(JPSインターセプタ・アプリケーション名)を変更することが可能になります。
スケジューラ・アプリケーションを開発するためのESSジョブ・サポート。これには次のものが含まれます。
MARプロファイルの作成と更新。
プロジェクト・サポートのためのJARデプロイメント・プロファイルの作成。
Oracle Enterprise Schedulerライブラリの追加。
このチュートリアルでビルドするEssDemoAppサンプル・アプリケーションには、Oracle Enterprise Scheduler APIを使用してOracle JDeveloperでビルドする完全なアプリケーションが含まれます。
この例では、ホスティング・アプリケーションおよび簡単なJavaジョブ実装を作成します。ここでの例は簡単ですが、そのジョブ・クラスによってExecutableインタフェースが実装され、このインタフェースから、より複雑なJavaジョブがその作業の一部として他のコードを呼び出すことができます。
ジョブ・リクエストをスケジュールするアプリケーションを作成するには、次を実行します:
Oracle Enterprise Schedulerでスケジュールして実行するロジックを指定するJavaクラスを作成します。
Oracle Enterprise Schedulerメタデータおよびジョブ・リクエストの特性を指定します。
Oracle Enterprise Scheduler APIを使用してジョブ・リクエストを指定および発行するJavaアプリケーションを定義します。アプリケーションは、2つのプロジェクトで構成されます。1つはジョブをホストするため、もう1つはジョブを発行するためのものです。
Oracle Enterprise Scheduler APIを使用するJavaアプリケーションをアセンブルおよびデプロイします。
Oracle Enterprise Scheduler APIを使用するJavaアプリケーションを実行します。
|
注意: この章の説明は、以前に保存したプロジェクトやその他の保存されたOracle JDeveloperがない状態でインストールした、新しいOracle JDeveloperを使用していることを前提としています。Oracle JDeveloperが以前に使用したものである場合、一部の手順がこの章で示す手順と正確には一致しなかったり、手順を短縮し、同じアクションをより少ないステップで実行できることがあります。場合によっては、Oracle JDeveloperの過去の使用に基づき、Oracle JDeveloperで一部のダイアログが表示されません。 |
Oracle Enterprise Schedulerを使用する場合、アプリケーション・メタデータはMDSを使用して格納されます。MDSを使用するには、MDSユーザーおよびスキーマが構成されたデータベースにアクセスできる必要があります。
Oracle Enterprise Schedulerがスタンドアロン・モードでデプロイされるWebLogic Serverインスタンスも必要です。Oracle Enterprise Schedulerスキーマがインストールされたデータベースにアクセスできる必要があります。
この項の内容は、次のとおりです。
Oracle JDeveloperを使用して、アプリケーション、およびアプリケーションのコードとサポート・ファイルを含むアプリケーション内のプロジェクトを作成します。サンプル・アプリケーションを作成するには、次を実行する必要があります:
Oracle JDeveloperでアプリケーションを作成します。
Oracle JDeveloperでプロジェクトを作成します。2つのプロジェクトを作成します。1つはHello WorldスタイルのJavaジョブを開発するための、もう1つはジョブによってリクエストを発行するクライアントを開発するためのプロジェクトです。
Oracle Enterprise Schedulerを使用するには、最初にOracle JDeveloperでアプリケーションを作成する必要があります。ジョブの実行をサポートするホスティング・アプリケーションも作成します。
EssDemoAppアプリケーションおよびホスト・プロジェクトを作成する手順は、次のとおりです。
第4.1項の説明に従って、Oracle JDeveloperを起動します。
「ロールの選択」ダイアログで「デフォルトのロール」を選択し、「OK」をクリックします。
「アプリケーション」メニューをクリックし、「新規」をクリックします。
「アプリケーションの名前付け」ウィンドウで、新規アプリケーションの名前と場所を入力します。
「アプリケーション名」フィールドで、アプリケーション名を入力します。このサンプル・アプリケーションの場合は、EssDemoAppと入力します。
「ディレクトリ」フィールドで、デフォルトを使用します。
アプリケーション・パッケージ接頭辞を入力するか、またはデフォルトである接頭辞なしを受け入れます。
接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。
「アプリケーション・テンプレート」領域で、「汎用アプリケーション」を選択します。
「次へ」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。
「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssHostと入力します。
「プロジェクト・テクノロジ」タブの「選択可能」の下で、「ESSホスト・サポート」および「ESSジョブ・サポート」をダブルクリックし、これらがダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。
これらの詳細は、第4.2項「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「Java設定の構成」ウィンドウの「デフォルト・パッケージ」フィールドに、oracle.esshostと入力します。
「次へ」をクリックします。
「EJB設定の構成」ウィンドウで、次のものを選択します。
「EJBバージョン」の下で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。
「EJBバージョン3.0」の下で、「ejb-jar.xmlをこのプロジェクトで生成します」チェック・ボックスを選択します。
「次へ」をクリックします。
「ESSホスト・サポート設定の構成」ウィンドウの「アプリケーションID」フィールドに、EssDemoAppと入力します。
「終了」をクリックします。
「EssDemoApp概要」ページが表示されます。このページのセクションを使用して、作成しているアプリケーションの状況に関する情報を取得し、開発の進捗状況を管理できます。次に、ジョブの作成をサポートするプロジェクトのアーティファクトの作成に進みます。
前の手順で、ジョブをホストするアプリケーションを開発するプロジェクトを作成しました。この項では、Oracle JDeveloperを使用して、EssDemoAppアプリケーションに別のプロジェクトを作成します。この2番目のプロジェクトによって、クライアントとホスティング・アプリケーションとの相互作用のサポートが提供されます。
クライアント・プロジェクトを作成する手順は、次のとおりです。
「ファイル」メニューをクリックし、「新規」をクリックします。
「新規ギャラリ」の「カテゴリ」で、「一般」を開き、「プロジェクト」をクリックします。
「アイテム」で「汎用プロジェクト」をクリックし、「OK」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するクライアント・プロジェクトの名前を入力し、サポートするテクノロジを選択します。
「プロジェクト名」フィールドに、クライアント・プロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssClientと入力します。
「プロジェクト・テクノロジ」タブの「選択可能」の下で、次の項目をダブルクリックし、ダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。
ESSクライアント・サポート
この詳細は、第4.2項「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
HTML
JSF
JSPおよびサーブレット
XML
「次へ」をクリックします。
「Java設定の構成」ウィンドウの「デフォルト・パッケージ」フィールドに、oracle.essclientと入力します。
「次へ」をクリックします。
「EJB設定の構成」ウィンドウで、次のものを選択します。
「EJBバージョン」の下で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。
「次へ」をクリックします。
「ESSクライアント・サポート設定の構成」ウィンドウの「アプリケーションID」フィールドで、EssDemoAppが表示されていることを確認します。
「終了」をクリックします。
ここで追加するJavaジョブの場合は、実装クラスによって、ジョブのロジック、つまり、ジョブの実際の作業を実行するコードが実装されます。クラスによってoracle.as.scheduler.Executableインタフェースが実装されます。インタフェースのexecuteメソッドによって、ジョブのロジックを追加できる場所が提供されます。この例のコードは非常に簡単ですが、executeメソッドは、Javaジョブがアクセスできるコードへ続く処理の開始点としても使用できます。
PL/SQLやプロセス・ジョブなどの他のジョブ・タイプと同様に、メタデータがJavaジョブの作業のガイドとなります。このメタデータによって、Oracle Enterprise Scheduler定義のシステム・プロパティ、ユーザーが作成するプロパティ、およびメタデータにアクセスできるユーザーの制御を含めることができる、ジョブ固有のコンテキストが形成されます。たとえば、メタデータを使用して、インスタンス・データを収集してダウンストリームのコードに渡すことができます。
EssDemoAppサンプル・アプリケーションを使用してジョブ・リクエストを発行するには、次のものを作成する必要があります。
Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位となる、ジョブ定義の形式のメタデータ
Javaジョブ実装クラス
この項では、Oracle JDeveloperを使用してジョブ定義メタデータおよびJavaジョブの簡単な実装クラスを作成します。
アプリケーションのメタデータを作成する手順は、次のとおりです。
アプリケーション・ナビゲータで、EssHostプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。
「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
図4-1に示すように、「アイテム」領域で「ジョブ定義」を選択します。
「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。
「ジョブ定義の作成」ダイアログで、次を指定します。
「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDefinitionを入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、/oracle/esshost/metadataと入力します。
メタデータ・パッケージ名で名前を区切るには、ドットではなくスラッシュを使用する必要があります。「.metadata」で終わるメタデータ・パッケージは、Oracle JDeveloperでは表示されません。
「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。
ジョブ・タイプがドロップダウンに表示されない場合は、第4.1項の説明に従ってOracle JDeveloperを起動したことを確認してください。
「Javaクラスの作成」チェック・ボックスおよび「同期」オプション・ボタンが選択されていることを確認します。
「Javaクラスの作成」チェック・ボックスを選択することにより、JavaジョブのJavaクラスの作成を要求し、後で作成する手間を省くことができます。「同期」オプションを選択することによって、そのジョブが同期Javaジョブになることを指定します。
「Javaクラス」で、作成するJavaクラスの詳細を指定します。「Javaパッケージ」フィールドに、パッケージ名(ここでは、oracle.esshost.impl)を入力します。図4-2に示すように、「クラス名」フィールドに、クラスの名前(ここでは、HelloWorldImpl)を入力します。
「OK」をクリックします。
要求したJavaクラスがHelloWorldJobDefinition.xmlファイルとともに作成されます。Oracle JDeveloperでXMLファイルのコンテンツが「ジョブ定義」ページに表示されます。
「ジョブ定義」ページで、ジョブのパラメータ、メタデータへのアクセスおよびローカライズに使用するリソース・バンドルを指定するプロパティを含むジョブ定義メタデータを編集できます。
「ジョブ定義」ページの「説明」フィールドに、ジョブ・タイプの説明を入力します。この例では、Sample Java Job Definitionと入力します。
残りのメタデータは変更しません。
「アプリケーション・ナビゲータ」で、プロジェクト・パネルの項目を「EssHost」→「アプリケーション・ソース」→「oracle.esshost.impl」→「HelloWorldImpl.java」の順に開き、作成したクラスを検索します。
ソース・エディタでHelloWorldImpl.javaを開きます。
ソース・エディタで、簡単なコードを追加してexecuteメソッドを実装します。executeメソッドは、Javaジョブの実行が開始される場所です。HelloWorldImplクラスは、例4-1のように表示されます。
例4-1 Executeメソッドが実装されたHelloWorldImpl
public class HelloWorldImpl implements Executable, Cancellable
{
public void execute(RequestExecutionContext ctx, RequestParameters params)
throws ExecutionErrorException, ExecutionWarningException,
ExecutionCancelledException, ExecutionPausedException
{
System.out.println("**** Sample Job Running, Request ID: " +
ctx.getRequestId());
}
public void cancel()
{
}
}
HelloWorldImpl.javaを保存して閉じます。
Oracle Enterprise Schedulerアプリケーションでは、アプリケーションのいずれかのコンポーネントからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppサンプル・アプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。
この項では、ジョブ発行リクエストを受信するためのサーブレットを作成します。
ジョブ・リクエストの発行をサポートするサーブレットを追加する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssClientプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。
図4-3に示すように、「アイテム」領域で「HTTPサーブレット」を選択します。
「OK」をクリックします。「HTTPサーブレット作成」ウィザードが表示されます。
「ようこそ」ページで「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで、次のように指定します。
「クラス」フィールドに、サーブレット・クラスの名前を入力します。この例では、名前EssDemoを入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle.essclient.servletと入力します。
「作成するコンテンツ・タイプ」フィールドのドロップダウン・リストで、「HTML」が選択されていることを確認します。
図4-4に示すように、「実装するメソッド」領域で、「doGet()」および「doPost()」チェック・ボックスを選択します。
「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ2 / 3: マッピング情報」ページで、次のように指定します。
「名前」フィールドに、サーブレットの名前を入力します。この例では、名前EssDemoを入力します。
「URLパターン」フィールドに、サーブレットのマッピングのURLを入力します。この例では、/essdemo/*と入力します。
「終了」をクリックします。
提供されたEssDemoアプリケーションには、完了したサーブレットが含まれています。ソース・コードをプロジェクトにコピーする必要があります。これを行うには、Oracle JDeveloperで、サーブレットのコンテンツをサンプル・アプリケーションに用意されているファイルEssDemo.javaのコンテンツで置き換えます。
Oracle Enterprise Schedulerプロパティでは、アプリケーションに関連付けられているejb-jar.xmlファイルで使用される設定の値を設定します。それらのプロパティは、次のとおりです。
論理アプリケーション名
アプリケーションを識別するために使用される論理名を指定します。アプリケーションをコンテナにデプロイするときに使用されるアプリケーション名とは区別します。この値を使用すると、論理アプリケーション名をソース・コードに安全にハードコードできます。
アプリケーション・ポリシー・ストライプ
セキュリティ・チェックを実行するために使用されるJPSセキュリティ・ストライプ(またはセキュリティ・コンテキスト)を指定します。
JPSインターセプタ・アプリケーション名
適用可能なセキュリティ・ポリシーのセットを判別するために実行時に使用される、アプリケーション・ストライプ名を指定します。
この項では、Oracle Enterprise Schedulerプロパティのデフォルト値を設定します。
Oracle Enterprise Schedulerプロパティの値を設定する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でEssHostプロジェクトを右クリックし、「エンタープライズ・スケジューラ・プロパティ」をクリックします。
「エンタープライズ・スケジューラ・プロパティ」ダイアログで、表示される3つのフィールド「論理アプリケーション名」、「アプリケーション・ポリシー・ストライプ」および「JPSインターセプタ・アプリケーション名」すべてにEssDemoAppと入力します。
「OK」をクリックします。
サンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
アプリケーションをアセンブルするには、次を実行します:
EJB JARファイルを作成します。
アプリケーションMARファイルを作成します。
アプリケーションEARファイルを作成します。
WARファイル・オプションを更新します。
サンプル・アプリケーションには、必要なEJBディスクリプタが含まれている必要があります。ejb-jar.xmlおよびweblogic-ejb-jar.xmlファイルを作成し、これらのファイルを、作成したJava実装クラスとともに含める必要があります。
Oracle Enterprise Schedulerがアプリケーションのかわりにジョブ・リクエストを実行している間にアプリケーションのエントリ・ポイントを検出できるように、Oracle Enterprise Schedulerには、EJB JARをアセンブルおよび提供するアプリケーションが必要です。このEJB jarでは、ejb-jar.xmlおよびweblogic-ejb-jarに必要なEJBディスクリプタがあること、およびOracle Enterprise Schedulerに対して発行されるすべてのJavaクラス実装が必要です。ディスクリプタ・ファイルejb-jar.xmlおよびweblogic-ejb-jarには、Oracle Enterprise Scheduler EJBについての記述が含まれている必要があり、これらのファイルは変更できません。
EJB-JARデプロイメント・プロファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、EssHostプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「アーカイブ・タイプ」ドロップダウンから「EJB JARファイル」を選択します。
「名前」フィールドに、EJBの名前を入力します。この例では、ess-ejbと入力します。
「OK」をクリックします。
「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲータで、「一般」をクリックします。
「一般」ウィンドウで、「エンタープライズ・アプリケーション名」フィールドにEssDemoAppと入力します。
ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「コントリビュータ」の順に開きます。
「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
プロジェクトの出力ディレクトリ
プロジェクトのソースパス
プロジェクトの追加のクラスパス
プロジェクトの依存性
ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「フィルタ」の順に開きます。
「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
META-INF(およびそのコンテンツ)
oracle (およびそのコンテンツ)
「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
この項では、Oracle JDeveloperでWARファイルの生成に使用できる情報を指定します。
WARアーカイブ・オプションを更新する手順は、次のとおりです。
「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、EssClientプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
「デプロイメント」ウィンドウで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「アーカイブ・タイプ」ドロップダウンから「WARファイル」を選択します。
「名前」フィールドにWAR_EssDemoAppと入力します。
「OK」をクリックします。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲータで、「一般」をクリックします。
「一般」ウィンドウで、「Java EE Webコンテキスト・ルートを指定」オプションを選択します。オプションの下のフィールドに、EssDemoと入力します。
ナビゲータで、「ファイル・グループ」→「Webファイル」→「コントリビュータ」の順に開きます。
「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
プロジェクトの出力ディレクトリ
プロジェクトのHTMLルート・ディレクトリ
プロジェクトのソースパス
ナビゲータで、「ファイル・グループ」→「Webファイル」→「フィルタ」の順に開きます。
「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
oracle (およびそのコンテンツ)
WEB-INF (およびそのコンテンツ)
「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
この項では、EssDemoAppサンプル・アプリケーションをアセンブルするEARファイルを準備します。EARアーカイブは次のもので構成されます。
Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JAR。
EssDemoサーブレットを含むWARアーカイブ。
EARオプションを更新する手順は、次のとおりです。
「アプリケーション」メニューをクリックし、「アプリケーションのプロパティ」をクリックします。
「アプリケーションのプロパティ」ダイアログのナビゲーション・ペインで、「デプロイメント」をクリックします。
「デプロイメント」ウィンドウで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「名前」フィールドに、デプロイメント・プロファイルの名前としてEAR_EssDemoAppと入力します。
「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログの左側にあるナビゲーション・ペインで、「アプリケーション・アセンブリ」をクリックします。
「アプリケーション・アセンブリ」ウィンドウの「Java EEモジュール」で、すべての項目のチェック・ボックスが選択されていることを確認します。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
EssDemoAppアプリケーションをビルドおよびアセンブルする手順を完了した後、Oracle WebLogic Serverにアプリケーションをデプロイする必要があります。アプリケーションを正常にデプロイした後、アプリケーションを実行できます。EssDemoAppサンプル・アプリケーションでは、ブラウザを使用してEssDemoサーブレットを実行し、Oracle WebLogic Serverで実行中のOracle Enterprise Schedulerにジョブ・リクエストを発行します。
EssDemoAppアプリケーションをデプロイするには、正しく構成され実行されているOracle WebLogic Server、およびアクティブなメタデータ・サーバーが必要です。アプリケーションをデプロイすると、Oracle JDeveloperで「デプロイメント構成」ページが表示されます。ドロップダウン・リストからリポジトリを選択し、パーティション名を入力します(パーティション名はデフォルトでアプリケーション名に設定されます)。
EssDemoAppアプリケーションをデプロイする手順は、次のとおりです。
ラン・マネージャをチェックして、Oracle WebLogic Serverが起動され、実行中であることを確認します。Oracle WebLogic Serverが実行中でない場合は、サーバーを起動します。サーバーを起動するには、「実行」メニューから「サーバー・インスタンスの起動」をクリックします。
「アプリケーション・ナビゲータ」で、EssDemoAppアプリケーションを選択します。
「アプリケーション・ナビゲータ」で、「アプリケーション・メニュー」から「デプロイ」→「EAR_EssDemoApp」→「デプロイ先」→「IntegratedWLSConnection」の順に選択します。
Oracle JDeveloperで「デプロイメント構成」ページが表示されます。「メタデータ・リポジトリ」で適切なオプションを選択します。
「デプロイ」をクリックします。
デプロイメント・ログを使用してデプロイメントを確認します。
EssDemoAppサンプル・アプリケーションを実行するには、ブラウザでEssDemoサーブレットにアクセスします。
EssDemoサーブレットにアクセスする手順は、次のとおりです。
ブラウザに次のURLを入力します。
http://host:http-port/context-root/essdemo
次に例を示します。
http://myserver.example.com:7101/EssDemoApp/essdemo
図4-5に示すように、EssDemoサーブレットが表示されます。
図4-5 Oracle Enterprise Schedulerサンプル・アプリケーションのEssDemoサーブレットの実行

「ジョブ」ドロップダウン・メニューからジョブ定義を選択します。
「スケジュール」ドロップダウン・メニューから値を選択します。
「発行」をクリックします。
ブラウザをリフレッシュして、図4-6に示すように、「リクエスト・ステータス」領域でジョブの進捗状況を確認します。
図4-6 発行されたリクエストのリクエスト・ステータスが示された、実行中のEssDemoサーブレット

Oracle Enterprise Schedulerアプリケーションをビルドおよびデプロイする場合、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)の2つの分割されたアプリケーションを使用できます。この設計を使用する場合、各アプリケーションは、このような分割構成をサポートするオプションを使用して構成およびデプロイする必要があります。さらに、一部のOracle Enterprise Schedulerデプロイメントでは、ホスティング・アプリケーションと発行元アプリケーションに別のOracle WebLogic Serverを使用します。このデプロイメント・オプションでは、発行元アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serverにデプロイされます。Oracle Enterprise Schedulerの発行者アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serversで実行される場合は、発行元アプリケーションがホスティング・アプリケーションを検出できるようにホスティング・アプリケーションのOracle WebLogic Serverを構成する必要があります。
|
注意: この項では、新しいアプリケーションを作成します。第4.3.1項で始まる項でEssDemoAppを作成した場合は、この項では同じ名前のプロジェクトを作成することに注意してください。この項でEssDemoAppのアプリケーション名を使用するには、アプリケーションに対して異なる場所を選択するか、または前のアプリケーションを削除する必要があります。 |
サンプルの分割されたアプリケーションをビルドするには、次を実行します:
スケジュールおよび実行されるコードを含むバックエンドのホスティング・アプリケーションをビルドします。
ジョブ・リクエストを開始するフロントエンドの発行者アプリケーションをビルドします。
この項の内容は、次のとおりです。
Oracle JDeveloperを使用して、バックエンドのアプリケーションを作成します。EssDemoAppのバックエンドのサンプル・アプリケーションを作成するには、次を実行します:
バックエンドのアプリケーションおよびプロジェクトを作成します。
セキュリティを構成します。
デプロイメント・ディスクリプタを定義します。
Oracle Enterprise Schedulerのexecutableインタフェースを実装するJavaクラスを作成します。
ジョブを記述するOracle Enterprise Schedulerメタデータを作成します。
アプリケーションをアセンブルします。
アプリケーションをデプロイします。
分割されたアプリケーションでOracle Enterprise Schedulerを使用するには、Oracle JDeveloperを使用してバックエンドのアプリケーションおよびプロジェクトを作成し、Oracle Enterprise Schedulerの拡張機能をプロジェクトに追加します。
バックエンドのホスティング・アプリケーションを作成する手順は、次のとおりです。
JDeveloperのメイン・メニューから、「ファイル」→「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「アプリケーション」→「汎用アプリケーション」を選択し、「OK」をクリックします。
汎用アプリケーションの作成ウィザードの「アプリケーションの名前付け」ページで、「アプリケーション名」フィールドをEssDemoAppに設定します。
「次へ」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。
「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、SuperEssと入力します。
「プロジェクト・テクノロジ」タブの「選択可能」で、「ESSホスト・サポート」および「ESSジョブ・サポート」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。
これらの詳細は、第4.2項「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「Java設定の構成」ページで、デフォルト・パッケージをoracle.apss.ess.howtoに変更し、「次へ」をクリックします。
「EJB設定の構成」ページで、「ejb-jar.xmlをこのプロジェクトで生成します」を選択し、「次へ」をクリックします。
「ESSホスト・サポート設定の構成」ページで、「アプリケーションID」フィールドにEssDemoAppと入力します。
「終了」をクリックします。
EssDempAppRoleロールに割り当てられたユーザーを作成する必要があります。
バックエンドのホスティング・アプリケーションのセキュリティを構成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション」→「保護」→「ADFセキュリティの構成」の順に選択します。
「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択し、「次へ」をクリックします。
このアプリケーションには保護するWebモジュールがないため、「認証タイプ」ページでデフォルト値をそのまま使用します。
「終了」をクリックします。
jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」→「META-INF」を開いて確認できます。このファイルには、アプリケーションに基づいて名前が付けられたセキュリティ・コンテキストまたはセキュリティ・ストライプが含まれています。
メイン・メニューから、「アプリケーション」→「保護」→「ユーザー」の順に選択します。
jazn-data.xmlという名前のファイルが生成されます。
jazn-data.xmlファイルの概要エディタで、「ユーザー」リストの「追加」アイコンをクリックします。
名前をEssDemoAppUserに設定し、パスワードをwelcome1に設定します。
「アプリケーション・ロール」ナビゲーション・タブをクリックします。
「ロール」リストの「追加」アイコンをクリックして、「新しいロールの追加」を選択します。
名前をEssDemoAppRoleに設定します。
「マッピング」タブで「追加」アイコンをクリックして、「ユーザーの追加」を選択します。
EssDemoAppUserを選択し、「OK」をクリックします。
Oracle Enterprise Schedulerの分割されたアプリケーションを使用してジョブ・リクエストを発行するには、次を含むジョブ・リクエストを定義するメタデータを作成する必要があります。
ジョブ・タイプ: 実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。
ジョブ定義: Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。
バックエンドのホスティング・アプリケーションのメタデータを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。
「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
図4-7に示すように、「アイテム」領域で「ジョブ定義」を選択します。
「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。
「ジョブ定義の作成」ダイアログで、次を指定します。
「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDefを入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle/apps/ess/howto/metadataと入力します。
「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。
ジョブ・タイプがドロップダウンに表示されない場合は、第4.1項の説明に従ってOracle JDeveloperを起動したことを確認してください。
「Javaクラスの作成」チェック・ボックスおよび「同期」オプション・ボタンが選択されていることを確認します。
「Javaクラスの作成」チェック・ボックスを選択することにより、JavaジョブのJavaクラスの作成を要求し、後で作成する手間を省くことができます。「同期」オプションを選択することによって、そのジョブが同期Javaジョブになることを指定します。
「Javaクラス」で、作成するJavaクラスの詳細を指定します。「Javaパッケージ」フィールドに、パッケージ名(ここでは、oracle.apps.ess.howto)を入力します。「クラス名」フィールドに、クラスの名前(ここでは、HelloWorldJob)を入力します。
「OK」をクリックします。
要求したJavaクラスがHelloWorldJobDefinition.xmlファイルとともに作成されます。Oracle JDeveloperでXMLファイルのコンテンツが「ジョブ定義」ページに表示されます。
「ジョブ定義」ページで、ジョブのパラメータ、メタデータへのアクセスおよびローカライズに使用するリソース・バンドルを指定するプロパティを含むジョブ定義メタデータを編集できます。
HelloWorldJobDef.xmlの「ジョブ定義」ページの「説明」フィールドに、HelloWorld Exampleと入力します。
「システム・プロパティ」セクションで、「追加」ボタンをクリックします。
「システム・プロパティの追加」ダイアログで、「名前」ドロップダウンからSYS_effectiveApplicationを選択します。
「初期値」フィールドに、EssDemoAppと入力します。
「OK」をクリックします。
「アクセス制御」セクションで、「追加」ボタンをクリックします。
「アクセス制御の追加」ダイアログで、「ロール」ドロップダウンのEssDemoAppRoleが選択されていることを確認します。これは、第4.4.1.2項で作成したロールです。
「読取り」および「実行」アクションを選択します。
「OK」をクリックします。
Oracle Enterprise Schedulerの制御の下でJavaクラスを実行するアプリケーションを定義するには、Oracle Enterprise Scheduler Executableインタフェースを実装するJavaクラスを作成する必要があります。Executableインタフェースでは、Oracle Enterprise Schedulerを使用したJavaクラスの呼出しを可能にする規定を指定します。
executeメソッドを実装する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、プロジェクト・パネルの項目を「SuperEss」→「アプリケーション・ソース」→「oracle.apps.ess」→「howto」→「HelloWorldJob.java」の順に開き、作成したクラスを検索します。
ソース・エディタでHelloWorldJob.javaを開きます。
ソース・エディタで、次のコードを追加してexecuteメソッドを実装します。executeメソッドは、Javaジョブの実行が開始される場所です。メソッド内のコードは、例4-2のように表示されます。
例4-2 HelloWorldJob Executeメソッドのコード
StringBuilder sb = new StringBuilder(1000);
sb.append("\n==================================");
sb.append("\n= EssDemoApp request is now running");
long myRequestId = ctx.getRequestId();
sb.append("\n= Request Id = " + myRequestId);
sb.append("\n= Request Properties:");
for (String paramKey : params.getNames()) {
Object paramValue = params.getValue(paramKey);
sb.append("\n=\t(" + paramKey + ", " + paramValue + ")");
}
sb.append("\n=");
sb.append("\n==================================");
Logger logger = Logger.getLogger("oracle.apps.ess.howto");
logger.info(sb.toString());
Oracle Enterprise Schedulerプロパティでは、アプリケーションに関連付けられているejb-jar.xmlファイルで使用される設定の値を設定します。それらのプロパティは、次のとおりです。
論理アプリケーション名
アプリケーションを識別するために使用される論理名を指定します。アプリケーションをコンテナにデプロイするときに使用されるアプリケーション名とは区別します。この値を使用すると、論理アプリケーション名をソース・コードに安全にハードコードできます。
アプリケーション・ポリシー・ストライプ
セキュリティ・チェックを実行するために使用されるJPSセキュリティ・ストライプ(またはセキュリティ・コンテキスト)を指定します。
JPSインターセプタ・アプリケーション名
適用可能なセキュリティ・ポリシーのセットを判別するために実行時に使用される、アプリケーション・ストライプ名を指定します。
Oracle Enterprise Schedulerプロパティの値を設定する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でEssHostプロジェクトを右クリックし、「エンタープライズ・スケジューラ・プロパティ」をクリックします。
「エンタープライズ・スケジューラ・プロパティ」ダイアログで、表示される3つのフィールド「論理アプリケーション名」、「アプリケーション・ポリシー・ストライプ」および「JPSインターセプタ・アプリケーション名」すべてにEssDemoAppと入力します。
「OK」をクリックします。
バックエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
バックエンドのアプリケーションをアセンブルするには、次を実行します:
EJB Javaアーカイブの作成
アプリケーションMARおよびEARファイルの作成
EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。
EJB-JARデプロイメント・プロファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」の「プロジェクト」パネルで、SuperEssプロジェクトを右クリックし、「プロジェクト・プロパティ」をクリックします。
「プロジェクト・プロパティ」ウィンドウのナビゲータで、「デプロイメント」をクリックします。
「デプロイメント・プロファイル」で、ウィンドウに表示されているすべてのプロファイルを削除し、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「アーカイブ・タイプ」ドロップダウンから「EJB JARファイル」を選択します。
「名前」フィールドに、EJBの名前を入力します。この例では、JAR_SuperEssEjbJarと入力します。
「OK」をクリックします。
「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「コントリビュータ」の順に開きます。
「コントリビュータ」ウィンドウで、次のチェック・ボックスを選択します。
プロジェクトの出力ディレクトリ
プロジェクトのソースパス
プロジェクトの追加のクラスパス
プロジェクトの依存性
ナビゲータで、「ファイル・グループ」→「プロジェクトの出力」→「フィルタ」の順に開きます。
「フィルタ」ウィンドウの「フィルタ」タブで、次のフォルダが選択されていることを確認します。
META-INF(およびそのコンテンツ)
oracle (およびそのコンテンツ)
「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
この項では、EssDemoAppサンプル・アプリケーションをアセンブルするEARファイルを準備します。EARアーカイブは次のもので構成されます。
Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JAR。
EssDemoサーブレットを含むWARアーカイブ。
EARオプションを更新する手順は、次のとおりです。
「アプリケーション」メニューをクリックし、「アプリケーションのプロパティ」をクリックします。
「アプリケーションのプロパティ」ダイアログのナビゲーション・ペインで、「デプロイメント」をクリックします。
デフォルトのMARファイルのプロファイルを選択し、「編集」をクリックします。
「MARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲーション・ペインで、「メタデータ・ファイル・グループ」→「ユーザー・メタデータ」→「ディレクトリ」の順に開き、「ディレクトリ」を選択します。
「ディレクトリ」ウィンドウで「oracle.apps.ess.howto」チェック・ボックスを選択し、「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログの「デプロイメント」ウィンドウで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「アーカイブ・タイプ」ドロップダウンから「EARファイル」を選択します。
「名前」フィールドに、EAR_EssDemoAppEarと入力します。
「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲーション・ペインで、「一般」をクリックします。
「一般」ウィンドウで、「アプリケーション名」フィールドにEssDemoAppと入力します。
ナビゲーション・ペインで「アプリケーション・アセンブリ」を選択します。
「アプリケーション・アセンブリ」ウィンドウで、すべての項目のチェック・ボックスが選択されていることを確認します。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
Oracle Enterprise Schedulerの分割されたアプリケーションでは、フロントエンドのアプリケーションからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppUIアプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。
フロントエンドの発行者サンプル・アプリケーションを作成するには、次を実行します:
フロントエンドのアプリケーションおよびプロジェクトを作成します。
ejb-jar.xmlファイルを構成します。
Webプロジェクトを作成します。
セキュリティを構成します。
HTTPサーブレットを作成します。
web.xmlファイルを編集します。
weblogic-application.xmlファイルを編集します。
adf-configファイルを編集します。
アプリケーションをアセンブルします。
アプリケーションをデプロイします。
フロントエンドの発行者アプリケーションをビルドするには、JDeveloperでバックエンドのホスティング・アプリケーションの場合に使用したのと同様の手順を使用します。
フロントエンドの発行者アプリケーションを作成する手順は、次のとおりです。
第4.4.1.1項「バックエンドのホスティング・アプリケーションの作成」の手順を完了しますが、ここではアプリケーションの名前としてESSDemoAppUIを使用します。ESSホスト・サポートの設定を構成する場合は、「アプリケーションID」フィールドに、必ずEssDemoAppと入力してください。
サーブレットのWebプロジェクトを作成する必要があります。
SuperWebプロジェクトを作成する手順は、次のとおりです。
SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「プロジェクト」→「汎用プロジェクト」を選択して、「OK」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。
「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、SuperWebと入力します。
「プロジェクト・テクノロジ」タブの「選択可能」で、「ESSクライアント・サポート」、「JSPおよびサーブレット」および「ADFライブラリWebアプリケーション・サポート」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。
ESSクライアント・サポートの詳細は、第4.2項「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「プロジェクトJava設定」ページで、デフォルト・パッケージをoracle.apss.ess.howtoに変更し、「終了」をクリックします。
アプリケーションのセキュリティを構成する必要があります。EssDemoAppUIアプリケーションはEssDemoAppアプリケーションによって作成されたユーザーおよびロールを共有するため、ユーザーやロールを作成する必要はありません。
フロントエンドの発行者アプリケーションのセキュリティを構成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション」→「保護」→「ADFセキュリティの構成」の順に選択します。
「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択します。
「認証タイプ」ページで、「Webプロジェクト」ドロップダウン・リストから「SuperWeb.jpr」を選択します。
「HTTP Basic認証」を選択します。
「終了」をクリックします。
jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」→「META-INF」を開いて確認できます。
通常は、Oracle Application Development Frameworkなどの重量フレームワーク上に作成されるより複雑なユーザー・インタフェースが使用されますが、簡単にするために、発行者アプリケーションには基本のHTTPサーブレットを使用します。
フロントエンドの発行者アプリケーションのHTTPサーブレットを作成する手順は、次のとおりです。
SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「Web層」を開き、「サーブレット」→「HTTPサーブレット」を選択して、「OK」をクリックします。
Webアプリケーション・ウィザードの「Webアプリケーション」ページで、「サーブレット2.5\\JSP 2.1 (Java EE 1.5)」を選択します。
「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで、「クラス」フィールドにEssDemoAppServletと入力します。
「パッケージ」フィールドにoracle.apps.ess.howtoと入力し、「次へ」をクリックします。
「終了」をクリックします。
ソース・エディタで、ESSDemoAppServlet.javaのコンテンツを例4-3に示すコードで置き換えます。
例4-3 フロントエンドの発行者アプリケーションのHTTPサーブレット・コード
package oracle.apps.ess.howto;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import oracle.as.scheduler.MetadataObjectId;
import oracle.as.scheduler.MetadataObjectId.MetadataObjectType;
import oracle.as.scheduler.MetadataService;
import oracle.as.scheduler.MetadataService.QueryField;
import oracle.as.scheduler.MetadataServiceHandle;
import oracle.as.scheduler.RequestDetail;
import oracle.as.scheduler.RequestParameters;
import oracle.as.scheduler.RuntimeService;
import oracle.as.scheduler.RuntimeServiceHandle;
import oracle.as.scheduler.State;
import oracle.as.scheduler.core.JndiUtil;
public class EssDemoAppServlet extends HttpServlet {
@SuppressWarnings("compatibility:4685800289380934682")
private static final long serialVersionUID = 1L;
private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
private static final String MESSAGE_KEY = "Message";
private static final String PATH_SUBMIT = "/submitRequest";
private static final String PATH_ALTER = "/alterRequest";
private static final String MDO_SEP = ";";
private static final String ACTION_CANCEL = "Cancel";
private static final String ESS_UNAVAIL_MSG =
"<p>Enterprise Scheduler Service is currently unavailable. Cause: %s</p>";
private enum PseudoScheduleChoices {
Immediately(0),
InTenSeconds(10),
InTenMinutes(10 * 60);
@SuppressWarnings("compatibility:-5637079380819677366")
private static final long serialVersionUID = 1L;
private int m_seconds;
private PseudoScheduleChoices(int seconds) {
m_seconds = seconds;
}
public int getSeconds() {
return m_seconds;
}
}
public EssDemoAppServlet() throws ServletException {
super();
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType(CONTENT_TYPE);
HttpSession session = request.getSession(true);
String lastMessage = String.valueOf(session.getAttribute(MESSAGE_KEY));
if ("null".equals(lastMessage)) {
lastMessage = "";
}
try {
RuntimeLists runtimeLists = getRuntimeLists();
MetadataLists metadataLists = getMetadataLists();
renderResponse(metadataLists, runtimeLists,
request, response, lastMessage);
} catch (ServletException se) {
throw se;
} catch (Exception e) {
throw new ServletException(e);
}
}
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession(true);
String pathInfo = request.getPathInfo();
// Clear the message on every post request
StringBuilder message = new StringBuilder("");
try {
// Select each handler based on the form action
if ("".equals(pathInfo)) {
// No processing
} else if (PATH_SUBMIT.equals(pathInfo)) {
postSubmitRequest(request, message);
} else if (PATH_ALTER.equals(pathInfo)) {
postAlterRequest(request, message);
} else {
message.append(String.format("<p>No handler for pathInfo=%s</p>",
pathInfo));
}
}
catch (ServletException se) {
Throwable t = se.getCause();
String cause = (t == null) ? se.toString() : t.toString();
message.append (String.format(ESS_UNAVAIL_MSG, cause));
}
// Storing the messages in the session allows them to persist
// through the redirect and across refreshes.
session.setAttribute(MESSAGE_KEY, message.toString());
// render the page by redirecting to doGet(); this intentionally
// strips the actions and post data from the request.
response.sendRedirect(request.getContextPath() +
request.getServletPath());
}
/**
* Handle the job submission form.
* @param request
* @param message
* @throws ServletException
*/
private void postSubmitRequest(HttpServletRequest request,
StringBuilder message)
throws ServletException
{
String jobDefName = request.getParameter("job");
String scheduleDefName = request.getParameter("schedule");
// Various required args for submission
Calendar start = Calendar.getInstance();
start.add(Calendar.SECOND, 2);
// Launch the job based on form contents
if (jobDefName == null || scheduleDefName == null) {
message.append("Both a job name and a schedule name must be specified\n");
} else {
PseudoScheduleChoices pseudoSchedule = null;
// See if schedule given is actually a pseudo schedule
try {
pseudoSchedule = PseudoScheduleChoices.valueOf(scheduleDefName);
} catch (IllegalArgumentException e) {
// The string is not a valid member of the enum
pseudoSchedule = null;
}
MetadataObjectId scheduleDefId = null;
String scheduleDefNamePart = null;
MetadataObjectId jobDefId = stringToMetadataObjectId(jobDefName);
// Don't look up schedules that aren't real
if (pseudoSchedule != null) {
scheduleDefNamePart = scheduleDefName;
start.add(Calendar.SECOND, pseudoSchedule.getSeconds());
} else {
scheduleDefId = stringToMetadataObjectId(scheduleDefName);
scheduleDefNamePart = scheduleDefId.getNamePart();
}
String jobDefNamePart = jobDefId.getNamePart();
String requestDesc = jobDefNamePart + "@" + scheduleDefNamePart;
Logger logger = getLogger();
long requestId = submitRequest(pseudoSchedule, requestDesc,
jobDefId, scheduleDefId, start, logger);
// Populate the message block based on results
message.append(String.format("<p>New request %d launched using %s</p>",
requestId, requestDesc));
}
}
private Long submitRequest(final PseudoScheduleChoices pseudoSchedule,
final String requestDesc,
final MetadataObjectId jobDefId,
final MetadataObjectId scheduleDefId,
final Calendar start,
final Logger logger)
throws ServletException
{
RuntimeServicePayload<Long> myPayload = new RuntimeServicePayload<Long>() {
@Override
Long execute(RuntimeService service,
RuntimeServiceHandle handle,
Logger logger)
throws Exception
{
RequestParameters params = new RequestParameters();
return (null != pseudoSchedule)
? service.submitRequest(handle, requestDesc, jobDefId,
start, params)
: service.submitRequest(handle, requestDesc, jobDefId,
scheduleDefId, null,
start, null, params);
}
};
try {
return performOperation(myPayload, logger);
} catch (Exception e) {
throw new ServletException("Error submitting request using job: " +
jobDefId + " and schedule: " +
scheduleDefId, e);
}
}
/**
* Handle the "Cancel" and "Purge" actions from the form enclosing
* the Request Status table.
* @param request
* @param message
* @throws ServletException
*/
private void postAlterRequest(HttpServletRequest request,
StringBuilder message)
throws ServletException
{
String cancelID = null;
/*
* there are a few assumptions going on here...
* the HTTP button being used to transmit the action and
* request is backwards from its normal usage (eg. the name
* should be invariable, and the value variable). Because we
* want to display either "Purge" or "Cancel" on the button, and
* transmit the reqId with it, we are reversing the map entry
* to get the key (which in this case will be the reqID), and
* match it to the value (Purge or Cancel).
* Assumptions are that there will be only one entry in the map
* per request (one purge or cancel). Also, that the datatypes
* for the key and value willl be those documented for
* ServletRequest (<K,V> = <String, String[]>).
*/
Map requestMap = request.getParameterMap();
Iterator mapIter = requestMap.entrySet().iterator();
while (mapIter.hasNext()) {
Map.Entry entry = (Map.Entry)mapIter.next();
String key = (String)entry.getKey();
String[] values = (String[])entry.getValue();
if (ACTION_CANCEL.equals(values[0])) {
cancelID = key;
}
}
if (cancelID != null) {
try {
final String cancelId2 = cancelID;
RuntimeServicePayload<Void> myPayload = new RuntimeServicePayload<Void>() {
@Override
Void execute(RuntimeService service,
RuntimeServiceHandle handle,
Logger logger)
throws Exception
{
service.cancelRequest(handle, Long.valueOf(cancelId2));
return null;
}
};
Logger logger = getLogger();
performOperation(myPayload, logger);
message.append
(String.format("<p>Cancelled request %s</p>", cancelID));
} catch (Exception e) {
throw new ServletException
("Error canceling or purging request", e);
}
} else {
message.append("<p>No purge or cancel action specified</p>");
}
}
private String metadataObjectIdToString(MetadataObjectId mdoID)
throws ServletException {
String mdoString =
mdoID.getType().value() + MDO_SEP + mdoID.getPackagePart() +
MDO_SEP + mdoID.getNamePart();
return mdoString;
}
private MetadataObjectId stringToMetadataObjectId(String mdoString)
throws ServletException {
String[] mdoStringParts = mdoString.split(Pattern.quote(MDO_SEP));
if (mdoStringParts.length != 3) {
throw new ServletException(String.format("Unexpected number of components %d found " +
"when converting %s to MetadataObjectID",
mdoStringParts.length,
mdoString));
}
MetadataObjectType mdType =
MetadataObjectType.getMOType(mdoStringParts[0]);
String mdPackage = mdoStringParts[1];
String mdName = mdoStringParts[2];
MetadataObjectId mdoID =
MetadataObjectId.createMetadataObjectId(mdType, mdPackage, mdName);
return mdoID;
}
/**
* this changes the format used in this class for job definitions to the one
* which will be used in the runtime query.
* @param strMetadataObject
* @return string representing object in runtime store
* @throws ServletException
*/
private String fixMetadataString(String strMetadataObject)
throws ServletException {
String fslash = "/";
String[] mdoStringParts =
strMetadataObject.split(Pattern.quote(MDO_SEP));
if (mdoStringParts.length != 3) {
throw new ServletException(String.format("Unexpected number of components %d found " +
"when converting %s to MetadataObjectID",
mdoStringParts.length,
strMetadataObject));
}
String[] trimStringParts = new String[mdoStringParts.length];
for (int i = 0; i < mdoStringParts.length; i++) {
String mdoStringPart = mdoStringParts[i];
trimStringParts[i] = mdoStringPart.replaceAll(fslash, " ").trim();
}
MetadataObjectType mdType =
MetadataObjectType.getMOType(trimStringParts[0]);
String mdPackage = fslash + trimStringParts[1];
String mdName = trimStringParts[2];
MetadataObjectId metadataObjId =
MetadataObjectId.createMetadataObjectId(mdType, mdPackage, mdName);
return metadataObjId.toString();
}
private Set<String> getSetFromMetadataEnum(Enumeration<MetadataObjectId> enumMetadata)
throws ServletException {
Set<String> stringSet = new HashSet<String>();
while (enumMetadata.hasMoreElements()) {
MetadataObjectId objId = enumMetadata.nextElement();
String strNamePart = objId.getNamePart();
stringSet.add(strNamePart);
}
return stringSet;
}
//****************************************************************************
//
// HTML Rendering Methods
//
//****************************************************************************
/**
* Rendering code for the page displayed.
* In a real application this would be done using JSP, but this approach
* keeps everything in one file to make the example easier to follow.
* @param response The response object from the main request.
* @param message Text that will appear in the message panel, may contain HTML
* @throws IOException
*/
private void renderResponse(MetadataLists ml,
RuntimeLists rl,
HttpServletRequest request,
HttpServletResponse response,
String message)
throws IOException, ServletException
{
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
String urlBase = request.getContextPath() + request.getServletPath();
// Indents maintained for clarity
out.println("<html>");
out.println("<head><title>EssDemo</title></head>");
out.println("<body>");
out.println("<table align=\"center\"><tbody>");
out.println(" <tr><td align=\"center\"><h1>Oracle Enterprise Scheduler Tutorial</h1></td></tr>");
out.println(" <tr><td align=\"center\"><table cellspacing=6><tr>");
// Job launch form
out.println(" <td align=\"center\">");
out.println(" <h2>Launch Job</h2>");
renderLaunchJobForm(ml, out, urlBase);
out.println(" </td>");
out.println(" <td align=\"center\" bgcolor=\"blue\" width=\"2\"/>");
out.println(" </tr></table></td></tr>");
out.println(" <tr><td bgcolor=\"red\"/></tr>");
// Message panel
out.println(" <tr><td align=\"center\"><h3>Messages</h3></td></tr>");
out.println(" <tr><td>");
out.println(message);
out.println(" </td></tr>");
out.println(" <tr><td bgcolor=\"red\"/></tr>");
// Request status
out.println(" <tr><td align=\"center\">");
out.println(" <form name=\"attrs\" action=\"" + urlBase +
PATH_ALTER + "\" method=\"post\">");
out.println(" <h2>Request Status</h2>");
out.println(" <table border=2><tbody>");
out.println(" <th>reqID</th>");
out.println(" <th>Description</th>");
out.println(" <th>Scheduled time</th>");
out.println(" <th>State</th>");
out.println(" <th>Action</th>");
renderStatusTable(out, rl.requestDetails);
out.println(" </tbody></table>");
out.println(" </form>");
out.println(" </td></tr>");
out.println("</tbody></table>");
out.println("</body></html>");
out.close();
}
private void renderLaunchJobForm(MetadataLists ml, PrintWriter out, String urlBase)
throws ServletException {
out.println(" <form name=\"attrs\" action=\"" + urlBase +
PATH_SUBMIT + "\" method=\"post\">");
out.println(" <table><tbody>");
out.println(" <tr><td align=\"right\">");
out.println(" <b>Job:</b>");
out.println(" <select name=\"job\">");
renderMetadataChoices(out, ml.jobDefList, false);
renderMetadataChoices(out, ml.jobSetList, false);
out.println(" </select>");
out.println(" </td></tr>");
out.println(" <tr><td align=\"right\">");
out.println(" <b>Schedule:</b>");
out.println(" <select name=\"schedule\">");
renderPseudoScheduleChoices(out);
renderMetadataChoices(out, ml.scheduleList, false);
out.println(" </select>");
out.println(" </td></tr>");
out.println(" <tr><td align=\"center\">");
out.println(" <input name=\"submit\" value=\"Submit\" type=\"submit\">");
out.println(" </td></tr>");
out.println(" </tbody></table>");
out.println(" </form>");
}
/**
*
* @param out - printwriter
* @param jobChoices -- metadata to be displayed
* @param bBlankFirst -- blank first (so that this param is not required)
* @throws ServletException
*/
private void renderMetadataChoices(PrintWriter out,
Enumeration<MetadataObjectId> jobChoices,
boolean bBlankFirst)
throws ServletException
{
if (jobChoices == null)
return;
boolean bFirst = true;
while (jobChoices.hasMoreElements()) {
MetadataObjectId job = jobChoices.nextElement();
String strJob = metadataObjectIdToString(job);
String strNamePart = job.getNamePart();
if (strNamePart.compareTo("BatchPurgeJob") == 0) {
continue;
} else {
if (bFirst && bBlankFirst) {
out.printf("<option value=\"%s\">%s</option>", "", "");
bFirst = false;
}
out.printf("<option value=\"%s\">%s</option>", strJob,
strNamePart);
}
}
}
/**
* helper method for rendering choices based on strings, adding an empty
* string to the beginning of the list
* @param out
* @param choices
*/
private void renderStringChoices(PrintWriter out, Set<String> choices) {
if (choices == null)
return;
choices.add("");
SortedSet<String> sorted = new TreeSet<String>(choices);
Iterator choiceIter = sorted.iterator();
while (choiceIter.hasNext()) {
String choice = (String)choiceIter.next();
out.printf("<option value=\"%s\">%s</option>", choice, choice);
}
}
private void renderPseudoScheduleChoices(PrintWriter out) {
for (PseudoScheduleChoices c : PseudoScheduleChoices.values()) {
out.printf("<option value=\"%s\">%s</option>", c, c);
}
}
private void renderStatusTable
(PrintWriter out, List<RequestDetail> reqDetails)
{
if (reqDetails == null) {
return;
}
for (RequestDetail reqDetail : reqDetails) {
State state = reqDetail.getState();
Calendar scheduledTime = reqDetail.getScheduledTime();
String scheduledTimeString = null;
if (scheduledTime == null) {
scheduledTimeString = "null scheduled time";
} else {
scheduledTimeString = String.valueOf(scheduledTime.getTime());
}
final String actionButton;
if (!state.isTerminal()) {
String action = ACTION_CANCEL;
String reqId = String.valueOf(reqDetail.getRequestId());
actionButton = String.format
("<button type=submit value=%s name=\"%s\">%s</button>",
action, reqId, action);
} else {
actionButton = " ";
}
out.printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
reqDetail.getRequestId(), reqDetail.getDescription(),
scheduledTimeString, state, actionButton);
}
}
private MetadataService getMetadataService() throws Exception {
return JndiUtil.getMetadataServiceEJB();
}
private RuntimeService getRuntimeService() throws Exception {
return JndiUtil.getRuntimeServiceEJB();
}
private abstract class Payload<SERVICE, HANDLE, RETURN> {
abstract SERVICE getService() throws Exception;
abstract HANDLE getHandle(SERVICE service) throws Exception;
abstract void closeHandle(SERVICE service,
HANDLE handle,
boolean abort)
throws Exception;
abstract RETURN execute(SERVICE service, HANDLE handle, Logger logger)
throws Exception;
}
private abstract class MetadataServicePayload<T>
extends Payload<MetadataService, MetadataServiceHandle, T>
{
@Override
MetadataService getService() throws Exception {
return getMetadataService();
}
@Override
MetadataServiceHandle getHandle(MetadataService service)
throws Exception
{
return service.open();
}
@Override
void closeHandle(MetadataService service,
MetadataServiceHandle handle,
boolean abort)
throws Exception
{
service.close(handle, abort);
}
}
private abstract class RuntimeServicePayload<T>
extends Payload<RuntimeService, RuntimeServiceHandle, T>
{
@Override
RuntimeService getService() throws Exception {
return getRuntimeService();
}
@Override
RuntimeServiceHandle getHandle(RuntimeService service)
throws Exception
{
return service.open();
}
@Override
void closeHandle(RuntimeService service,
RuntimeServiceHandle handle,
boolean abort)
throws Exception
{
service.close(handle, abort);
}
}
private <S, H, R> R performOperation
(Payload<S, H, R> payload, Logger logger)
throws Exception
{
S service = payload.getService();
H handle = payload.getHandle(service);
Exception origException = null;
try {
return payload.execute(service, handle, logger);
} catch (Exception e2) {
origException = e2;
throw e2;
} finally {
if (null != handle) {
try {
boolean abort = (null != origException);
payload.closeHandle(service, handle, abort);
} catch (Exception e2) {
if (null != origException) {
logger.log(Level.WARNING, "An error occurred while " +
"closing handle, however, a previous failure was " +
"detected. The following error will be logged " +
"but not reported: " + stackTraceToString(e2));
}
}
}
}
}
private final String stackTraceToString(Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
pw.close();
return sw.toString();
}
private Logger getLogger() {
return Logger.getLogger(this.getClass().getName());
}
private class MetadataLists {
private final Enumeration<MetadataObjectId> jobDefList;
private final Enumeration<MetadataObjectId> jobSetList;
private final Enumeration<MetadataObjectId> scheduleList;
private final Enumeration<MetadataObjectId> jobTypeList;
private MetadataLists(Enumeration<MetadataObjectId> jobDefList,
Enumeration<MetadataObjectId> jobSetList,
Enumeration<MetadataObjectId> scheduleList,
Enumeration<MetadataObjectId> jobTypeList)
{
this.jobDefList = jobDefList;
this.jobSetList = jobSetList;
this.scheduleList = scheduleList;
this.jobTypeList = jobTypeList;
}
}
private class RuntimeLists {
private final List<RequestDetail> requestDetails;
private final Set<String> applicationChoices;
private final Set<String> stateChoices;
private final Set<MetadataObjectId> jobDefMDOChoices;
private RuntimeLists(List<RequestDetail> requestDetails,
Set<String> applicationChoices,
Set<String> stateChoices,
Set<MetadataObjectId> jobDefMDOChoices)
{
super();
this.requestDetails = requestDetails;
this.applicationChoices = applicationChoices;
this.stateChoices = stateChoices;
this.jobDefMDOChoices = jobDefMDOChoices;
}
}
/**
* Retrieve lists of jobs, schedules, and status for use by the renderer
* @throws ServletException
*/
private MetadataLists getMetadataLists() throws Exception {
Logger logger = getLogger();
MetadataServicePayload<MetadataLists> myPayload =
new MetadataServicePayload<MetadataLists>()
{
@Override
MetadataLists execute(MetadataService service,
MetadataServiceHandle handle,
Logger logger)
throws Exception
{
Enumeration<MetadataObjectId> jobDefs =
service.queryJobDefinitions(handle, null, QueryField.NAME, true);
Enumeration<MetadataObjectId> jobSets =
service.queryJobSets(handle, null, QueryField.NAME, true);
Enumeration<MetadataObjectId> schedules =
service.querySchedules(handle, null, QueryField.NAME, true);
Enumeration<MetadataObjectId> jobTypes =
service.queryJobTypes(handle, null, QueryField.NAME, true);
return new MetadataLists(jobDefs, jobSets, schedules, jobTypes);
}
};
MetadataLists ml = performOperation(myPayload, logger);
return ml;
}
private RuntimeLists getRuntimeLists() throws Exception {
Logger logger = getLogger();
RuntimeServicePayload<List<RequestDetail>> myPayload2 =
new RuntimeServicePayload<List<RequestDetail>>()
{
@Override
List<RequestDetail> execute(RuntimeService service,
RuntimeServiceHandle handle,
Logger logger)
throws Exception
{
List<RequestDetail> reqDetails =
new ArrayList<RequestDetail>(10);
Enumeration requestIds = service.queryRequests
(handle, null, RuntimeService.QueryField.REQUESTID, true);
while (requestIds.hasMoreElements()) {
Long reqId = (Long)requestIds.nextElement();
RequestDetail detail = service.getRequestDetail(handle, reqId);
reqDetails.add(detail);
}
return reqDetails;
}
};
List<RequestDetail> reqDetails = performOperation(myPayload2, logger);
RuntimeLists rl = getRuntimeLists(reqDetails);
return rl;
}
private RuntimeLists getRuntimeLists(List<RequestDetail> reqDetails) {
Set<String> applicationSet = new HashSet<String>(10);
Set<String> stateSet = new HashSet<String>(10);
Set<MetadataObjectId> jobDefMOSet = new HashSet<MetadataObjectId>(10);
if (reqDetails != null) {
ListIterator detailIter = reqDetails.listIterator();
while (detailIter.hasNext()) {
RequestDetail detail = (RequestDetail)detailIter.next();
applicationSet.add(detail.getDeployedApplication());
State state = detail.getState();
if (state.isTerminal())
stateSet.add(state.name());
jobDefMOSet.add(detail.getJobDefn());
}
}
RuntimeLists rl = new RuntimeLists
(reqDetails, applicationSet, stateSet, jobDefMOSet);
return rl;
}
}
Oracle Enterprise SchedulerメタデータおよびランタイムEJB参照を追加するには、web.xmlファイルを編集する必要があります。
フロントエンドの発行者アプリケーションのweb.xmlファイルを編集する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で「SuperWeb」→「Webコンテンツ」→「WEB-INF」の順に開き、「web.xml」をダブルクリックします。
概要エディタで「参照」ナビゲーション・タブをクリックし、「EJB参照」セクションを開きます。
表4-1に示す情報を含む2つのEJBリソースを追加します。
「サーブレット」ナビゲーション・タブをクリックし、「サーブレット・マッピング」タブをクリックします。
/essdemoappservlet URLパターンを/essdemoappservlet/*に変更します。
weblogic-application.xmlファイルを作成し、編集する必要があります。
フロントエンドの発行者アプリケーションのweblogic-application.xmlファイルを編集する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「デプロイメント・ディスクリプタ」→「Weblogicデプロイメント・ディスクリプタ」を選択し、「OK」をクリックします。
「ディスクリプタの選択」ページでweblogic-application.xmlを選択します。
「次へ>」をクリックし、再度「次へ>」をクリックして「終了」をクリックします。
ソース・エディタで、作成したweblogic-application.xmlファイルのコンテンツを例4-4に示すXMLで置き換えます。
例4-4 フロントエンドの発行者アプリケーションのweblogic-application.xmlにコピーするコンテンツ
<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application
http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd"
xmlns="http://www.bea.com/ns/weblogic/weblogic-application">
<!-- The following application parameter tells JPS which stripe it should
- use to upload the jazn-data.xml policy. If this parameter is not
- specified, it will use the Java EE deployment name plus the version
- number (e.g. EssDemoApp#V2.0).
-->
<application-param>
<param-name>jps.policystore.applicationid</param-name>
<param-value>EssDemoAppUI</param-value>
</application-param>
<!-- This listener allows JPS to configure itself and upload the
- jazn-data.xml policy to the appropriate stripe
-->
<listener>
<listener-class>oracle.security.jps.wls.listeners.JpsApplicationLifecycleListener</listener-class>
</listener>
<!-- This listener allows MDS to configure itself and upload any metadata
- as defined by the MAR profile and adf-config.xml
-->
<listener>
<listener-class>oracle.mds.lcm.weblogic.WLLifecycleListener</listener-class>
</listener>
<!-- This listener allows Oracle Enterprise Scheduler to configure itself
-->
<listener>
<listener-class>oracle.as.scheduler.platform.wls.deploy.ESSApplicationLifecycleListener</listener-class>
</listener>
<!-- This shared library contains all the Oracle Enterprise Scheduler classes
-->
<library-ref>
<library-name>oracle.ess.client</library-name>
</library-ref>
<library-ref>
<library-name>adf.oracle.domain</library-name>
</library-ref>
</weblogic-application>
ホスティング・アプリケーションで作成されたメタデータを共有するようにアプリケーションに通知するには、adf-config.xmlファイルを編集する必要があります。
フロントエンドの発行者アプリケーションのadf-config.xmlファイルを編集する手順は、次のとおりです。
「アプリケーション・リソース」パネルで、「ディスクリプタ」→「ADF META-INF」を開き、adf-config.xmlをダブルクリックします。
ソース・エディタで、adf-config.xmlファイルのコンテンツを例4-5に示すXMLで置き換えます。
例4-5 フロントエンドの発行者アプリケーションのadf-config.xmlにコピーするコンテンツ
<?xml version="1.0" encoding="UTF-8" ?>
<adf-config xmlns="http://xmlns.oracle.com/adf/config">
<adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config">
<JaasSecurityContext initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactory"
jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext"
authorizationEnforce="false"
authenticationRequire="true"/>
</adf-security-child>
<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
<mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000">
<persistence-config>
<metadata-namespaces>
<namespace metadata-store-usage="ess_shared_metadata" path="/oracle/apps/ess/howto"/>
</metadata-namespaces>
<metadata-store-usages>
<metadata-store-usage default-cust-store="false" deploy-target="false" id="ess_shared_metadata"/>
</metadata-store-usages>
</persistence-config>
</mds-config>
</adf-mds-config>
</adf-config>
フロントエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
バックエンドのアプリケーションをアセンブルするには、次を実行します:
EJB Javaアーカイブの作成
WARファイルの作成
アプリケーションMARおよびEARファイルの作成
EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。
フロントエンドの発行者アプリケーションのEJB JARファイルをアセンブルする手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」→「EJB JARファイル」を選択して、「OK」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「デプロイメント・プロファイル名」をJAR_SuperEssEjbJarに設定します。
「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
WebアプリケーションのWebアーカイブ・ファイルを作成する必要があります。
フロントエンドの発行者アプリケーションのWARファイルをアセンブルする手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperWebプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」→「WARファイル」を選択して、「OK」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「デプロイメント・プロファイル名」をWAR_SuperWebWarに設定します。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「Java EE Webコンテキスト・ルートを指定」を選択してESSDemoAppと入力します。
「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
サンプル・アプリケーションには、EssDemoAppのバックエンドのアプリケーションをアセンブルするMARプロファイルおよびEARファイルが含まれている必要があります。
フロントエンドの発行者アプリケーションのMARおよびEARファイルを作成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション・メニュー」→「アプリケーションのプロパティ...」を選択します。
「アプリケーションのプロパティ」ダイアログで「デプロイメント」ナビゲーション・タブをクリックし、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「MARファイル」を選択します。
「名前」フィールドにMAR_EssDemoAppUIMarと入力し、「OK」をクリックします。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログの「デプロイメント」ページで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「EARファイル」を選択します。
「名前」フィールドにEAR_EssDemoAppUIEarと入力し、「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「アプリケーション名」フィールドにEssDemoAppUIと入力します。
「アプリケーション・アセンブリ」ナビゲーション・タブをクリックし、MAR_ESSDemoAppUIMarを選択してJAR_SuperEssEjbJarを選択します。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
アプリケーションをアセンブルした後、サーバーにデプロイできます。
フロントエンドの発行者アプリケーションをデプロイする手順は、次のとおりです。
メイン・メニューから、「アプリケーション」→「デプロイ」→「EAR_EssDemoUIEar...」の順に選択します。
アプリケーションをコンテナに設定し、デプロイします。
「デプロイメント構成」ダイアログで、「共有メタデータ・リポジトリ」パネルに2つのエントリがあります。/oracle/apps/ess/howtoネームスペースにマップされた共有リポジトリを検索します。そのパーティションを、EssDemoAppのデプロイ時に使用したパーティションに変更します。デフォルト値を使用した場合、これはEssDemoApp_V2.0になります。
「OK」をクリックします。