この章は、Oracle Enterprise Schedulerを使用してジョブ・リクエストを実行するアプリケーションを作成および実行する方法について説明し、Oracle Enterprise Schedulerを使用するアプリケーションをOracle JDeveloperで作成する方法を示すチュートリアルです。
次に、この章では2つの分割されたアプリケーションである、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)を使用する、サンプル・アプリケーションのバリエーションを示します。
注意:
Oracle Enterprise Schedulerのサンプル・コードについては、サンプル・サイト(https://java.net/projects/oraclesoasuite12c
)を参照してください。
この章の内容は次のとおりです。
Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションを開発する場合は、ミドルウェア・ホームの環境変数をOracle JDeveloper自体のインストール場所に設定する必要があります。Oracle JDeveloperを使用してOracle Enterprise Schedulerアプリケーションの開発を始める前に、必ずこの変数を設定してください。
JDeveloperには、スクリーン・リーダー、スクリーン拡大鏡、キーボード移動用の標準のショートカット・キーなどのアクセシビリティ・オプションが用意されています。さらに読みやすくするため、フォントのサイズや色、オブジェクトの色や形など、JDeveloperをカスタマイズすることもできます。JDeveloperでのアクセシビリティについて、およびこれを構成する手順は、『Oracle JDeveloperによるアプリケーションの開発』のOracle JDeveloperのアクセシビリティ情報に関する項を参照してください。
Oracle Enterprise Schedulerアプリケーションをビルドするための環境を設定する手順は、次のとおりです。
Oracle Enterprise Schedulerアプリケーションを開発するためにOracle JDeveloperでプロジェクトを作成すると、特定のプロジェクト・テクノロジのサポートを指定することで、アプリケーション機能に対する基礎となるサポートが追加されます。
Oracle Enterprise Schedulerアプリケーションの作成の詳細は、「組み合されたOracle Enterprise Schedulerアプリケーションのビルド」および「分割された発行者アプリケーションおよびホスティング・アプリケーションのビルド」を参照してください。
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アプリケーションおよびホスト・プロジェクトを作成する手順は、次のとおりです。
「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、Oracle JDeveloperを起動します。
「ロールの選択」ダイアログで「デフォルトのロール」を選択し、「OK」をクリックします。
「アプリケーション」メニューをクリックし、次に「新規」をクリックして「ギャラリから」オプションを選択します。
「アプリケーションの名前付け」ウィンドウで、新規アプリケーションの名前と場所を入力します。
「新規ギャラリ」ウィンドウで、一般カテゴリ・アプリケーション項目の下にリストされた「カスタム・アプリケーション」を選択し、「OK」をクリックします。
「アプリケーション名」フィールドで、アプリケーション名を入力します。このサンプル・アプリケーションの場合は、EssDemoApp
と入力します。
「ディレクトリ」フィールドで、デフォルトを使用します。
アプリケーション・パッケージ接頭辞を入力するか、またはデフォルトである接頭辞なしを受け入れます。
接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。
「次へ」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。図7-1を参照してください。
「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssHost
と入力します。
「プロジェクトの機能」タブの「選択可能」の下で、「ESSホスト・サポート」および「ESSジョブ・サポート」をダブルクリックし、これらがダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。
これらの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「Java設定の構成」ウィンドウの「デフォルト・パッケージ」フィールドに、oracle.esshost
と入力します。
「次へ」をクリックします。
「EJB設定の構成」ウィンドウで、次のものを選択します。
「EJBバージョン」の下で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。
「EJBバージョン3.x」の下で、「ejb-jar.xmlをこのプロジェクトで生成します」チェック・ボックスを選択します。
「次へ」をクリックします。
「ESSホスト・サポート設定の構成」ウィンドウの「アプリケーションID」フィールドに、EssDemoApp
と入力します。
「終了」をクリックします。
「EssDemoApp概要」ページが表示されます。このページのセクションを使用して、作成しているアプリケーションの状況に関する情報を取得し、開発の進捗状況を管理できます。次に、ジョブの作成をサポートするプロジェクトのアーティファクトの作成に進みます。
前の手順で、ジョブをホストするアプリケーションを開発するプロジェクトを作成しました。この項では、Oracle JDeveloperを使用して、EssDemoAppアプリケーションに別のプロジェクトを作成します。この2番目のプロジェクトでは、クライアントとホスティング・アプリケーションの対話をサポートします。
クライアント・プロジェクトを作成する手順は、次のとおりです。
「ファイル」メニューをクリックし、「新規」→「プロジェクト」をクリックします。
「新規ギャラリ」の「カテゴリ」で、「一般」を開き、「プロジェクト」をクリックします。
「アイテム」で「カスタム・プロジェクト」をクリックし、「OK」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するクライアント・プロジェクトの名前を入力し、サポートするテクノロジを選択します。図7-2を参照してください。
「プロジェクト名」フィールドに、クライアント・プロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、EssClient
と入力します。
「プロジェクトの機能」タブの「選択可能」の下で、次の項目をダブルクリックし、ダイアログ・ボックスの右側にある「選択済」の下に表示されるようにします。
ESSクライアント・サポート
HTMLおよびCSS
JSF
JSPおよびサーブレット
XML
この詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「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]キーを押します。「新規ギャラリ」が表示されます。
「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
図7-3に示すように、「アイテム」領域で「ジョブ定義」を選択します。
図7-3 サンプル・アプリケーションへのジョブ・タイプ・メタデータの追加
「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。
「ジョブ定義の作成」ダイアログで、次を指定します。
「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDefinition
を入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、/oracle/esshost/metadata
と入力します。
メタデータ・パッケージ名で名前を区切るには、ドットではなくスラッシュを使用する必要があります。「.metadata」で終わるメタデータ・パッケージは、Oracle JDeveloperでは表示されません。
「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。
ドロップダウンにジョブ・タイプが表示されない場合は、「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、Oracle JDeveloperを起動したことを確認します。
「Javaクラスの作成」チェック・ボックスおよび「同期」オプション・ボタンが選択されていることを確認します。
「Javaクラスの作成」チェック・ボックスを選択することにより、JavaジョブのJavaクラスの作成を要求し、後で作成する手間を省くことができます。「同期」オプションを選択することによって、そのジョブが同期Javaジョブになることを指定します。
「Javaクラス」で、作成するJavaクラスの詳細を指定します。「Javaパッケージ」フィールドに、パッケージ名(ここでは、oracle.esshost.impl
)を入力します。図7-4に示すように、「クラス名」フィールドに、クラスの名前(ここでは、HelloWorldImpl
)を入力します。
図7-4 ジョブ定義作成ウィザードによるジョブ定義の作成
「OK」をクリックします。
要求したJavaクラスがHelloWorldJobDefinition.xml
ファイルとともに作成されます。Oracle JDeveloperでXMLファイルのコンテンツが「ジョブ定義」ページに表示されます。
「ジョブ定義」ページで、ジョブのパラメータ、メタデータへのアクセスおよびローカライズに使用するリソース・バンドルを指定するプロパティを含むジョブ定義メタデータを編集できます。
「ジョブ定義」ページの「説明」フィールドに、ジョブ・タイプの説明を入力します。この例では、Sample Java Job Definition
と入力します。
残りのメタデータは変更しません。
「アプリケーション・ナビゲータ」で、プロジェクト・パネルの項目を「EssHost」→「アプリケーション・ソース」→「oracle.esshost.impl」→「HelloWorldImpl.java」の順に開き、作成したクラスを検索します。
ソース・エディタでHelloWorldImpl.javaを開きます。
ソース・エディタで、簡単なコードを追加してexecuteメソッドを実装します。executeメソッドは、Javaジョブの実行が開始される場所です。HelloWorldImplクラスは、例7-1のように表示されます。
HelloWorldImpl.javaを保存して閉じます。
例7-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() { } }
Oracle Enterprise Schedulerアプリケーションでは、アプリケーションのいずれかのコンポーネントからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppサンプル・アプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。
この項では、ジョブ発行リクエストを受信するためのサーブレットを作成します。
ジョブ・リクエストの発行をサポートするサーブレットを追加する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssClientプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。
図7-5に示すように、「アイテム」領域で「HTTPサーブレット」を選択します。
図7-5 サンプル・アプリケーションへのジョブ・タイプ・メタデータの追加
「OK」をクリックします。「HTTPサーブレット作成」ウィザードが表示されます。
「ようこそ」ページで「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ2/4: サーブレット情報」ページで、次のように指定します。
「クラス」フィールドに、サーブレット・クラスの名前を入力します。この例では、名前EssDemo
を入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle.essclient.servlet
と入力します。
「作成するコンテンツ・タイプ」フィールドのドロップダウン・リストで、「HTML」が選択されていることを確認します。
図7-6に示すように、「実装するメソッド」領域で、「doGet()」および「doPost()」チェック・ボックスを選択します。
図7-6 サーブレットの作成 -- ステップ2/4
「登録」領域で、「構成ファイル(web.xml)」ラジオ・ボタンを選択します。
「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ3 / 4: マッピング情報」ページで、次のように指定します。
「名前」フィールドに、サーブレットの名前を入力します。この例では、名前EssDemo
を入力します。
「URLパターン」フィールドに、サーブレットのマッピングのURLを入力します。この例では、/essdemo/*
と入力します。
「終了」をクリックします。
提供されたEssDemoアプリケーションには、完了したサーブレットが含まれています。ソース・コードをプロジェクトにコピーする必要があります。これを行うには、Oracle JDeveloperで、サーブレットのコンテンツをサンプル・アプリケーションに用意されているファイルEssDemo.javaのコンテンツで置き換えます。
Oracle Enterprise Schedulerプロパティでは、アプリケーションに関連付けられているejb-jar.xmlファイルで使用される設定の値を設定します。それらのプロパティは、次のとおりです。
論理アプリケーション名
アプリケーションを識別するために使用される論理名を指定します。アプリケーションをコンテナにデプロイするときに使用されるアプリケーション名とは区別します。この値を使用すると、論理アプリケーション名をソース・コードに安全にハードコードできます。
アプリケーション・ポリシー・ストライプ
セキュリティ・チェックを実行するために使用されるJPSセキュリティ・ストライプ(またはセキュリティ・コンテキスト)を指定します。
JPSインターセプタ・アプリケーション名
適用可能なセキュリティ・ポリシーのセットを判別するために実行時に使用される、アプリケーション・ストライプ名を指定します。
この項では、Oracle Enterprise Schedulerプロパティのデフォルト値を設定します。
Oracle Enterprise Schedulerプロパティの値を設定する手順は、次のとおりです。
EssDemoApp
と入力します。サンプル・アプリケーションを作成した後、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デプロイメント・プロファイルを作成する手順は、次のとおりです。
この項では、Oracle JDeveloperでWARファイルの生成に使用できる情報を指定します。
WARアーカイブ・オプションを更新する手順は、次のとおりです。
この項では、EssDemoAppサンプル・アプリケーションをアセンブルするEARファイルを準備します。EARアーカイブは次のもので構成されます。
Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JAR。
EssDemoサーブレットを含むWARアーカイブ。
EARオプションを更新する手順は、次のとおりです。
EssApplicationRole
ロールに割り当てられるユーザーを作成する必要があります。次の手順は、バックエンド・ホスティング・アプリケーションのセキュリティを構成する方法を示しています。
次の手順は、ESSアプリケーション・ロールに対するリソース権限を追加してジョブ定義を更新する方法を示しています。
HelloWorld Example
と入力します。EssDemoApp
と入力します。例7-2 jazn-data.xml
<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?> <jazn-data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/jazn-data.xsd"> <jazn-realm default="jazn.com"> <realm> <name>>Username / password is: EssUser / welcome1</name> <users> <user> <name>EssUser</name> <credentials>{903}LmqEdVs3zO0/QmP90tihXv4nRq5YqYSL</credentials> </user> </users> </realm> </jazn-realm> <policy-store> <applications> <application> <name>EssDemoApp</name> <app-roles> <app-role> <name>EssApplicationRole</name> <class>oracle.security.jps.service.policystore.ApplicationRole</class> <members> <member> <class>oracle.security.jps.internal.core.principals.JpsXmlUserImpl</class> <name>EssUser</name> </member> </members> </app-role> </app-roles> <jazn-policy> <grant> <grantee> <principals> <principal> <class>oracle.security.jps.service.policystore.ApplicationRole</class> <name>EssApplicationRole</name> </principal> </principals> </grantee> <permissions> <permission> <class>oracle.as.scheduler.security.MetadataPermission</class> <name>oracle.esshost.metadata.JobDefinition.HelloWorldJobDefinition</name> <actions>Read,Update,Delete,Execute</actions> </permission> </permissions> </grant> </jazn-policy> </application> </applications> </policy-store> <system-policy/> </jazn-data>
ソース・エディタを使用して、weblogic-application.xml
から次の行を削除します。
<library-ref> <library-name>oracle.applcp.runtime</library-name> </library-ref> <library-ref> <library-name>oracle.xdo.runtime</library-name> </library-ref>
EssHost META-INF/MANIFEST.INF
ファイルのコンテンツを次の行と置き換えます。
Manifest-Version: 1.0 Weblogic-Application-Version: 3.0 Extension-List: essruntime essruntime-Extension-Name: oracle.ess.runtime essruntime-Specification-Version: 12
「EssClient」→「Webコンテンツ」→「WEB-INF」→「web.xml」の順に移動します(図7-12を参照)。「セキュリティ」ウィンドウの「レルム」フィールドの次の値を変更します。
jazn.com
変更後:
Username / password is: EssUser / welcome1
adf-config.xml
ファイルのコンテンツを例7-3に示すXMLコードで置き換えます。例7-3 EssDemoAppアプリケーションのadf-config.xmlファイル
<?xml version="1.0" encoding="UTF-8" ?> <adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:sec="http://xmlns.oracle.com/adf/security/config"> <sec:adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config"> <CredentialStoreContext credentialStoreClass="oracle.adf.share.security.providers.jps.CSFCredentialStore" credentialStoreLocation="../../src/META-INF/jps-config.xml"/> <sec:JaasSecurityContext initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactory" jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext" authorizationEnforce="false" authenticationRequire="true"/> </sec:adf-security-child> <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config"> <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config"> <persistence-config> <metadata-namespaces> <namespace path="/oracle/as/ess/core" metadata-store-usage="ess-core"/> </metadata-namespaces> <metadata-store-usages> <metadata-store-usage id="ess-core" deploy-target="false" default-cust-store="false"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/> <property name="repository-name" value="mds-ESS_MDS_DS"/> <property name="partition-name" value="essapp-internal-partition"/> </metadata-store> </metadata-store-usage> </metadata-store-usages> </persistence-config> </mds-config> </adf-mds-config> </adf-config>
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が実行中でない場合は、サーバーを起動します。Oracle JDeveloperにサーバーへの接続があることを確認します(例: MyConnection)。
「アプリケーション・ナビゲータ」で、EssDemoAppアプリケーションを選択します。
「アプリケーション・ナビゲータ」で、「アプリケーション・メニュー」から「デプロイ」→「EAR_EssDemoApp」→「デプロイ先」→「MyConnection」の順に選択します。
Oracle JDeveloperで「デプロイメント構成」ページが表示されます。「メタデータ・リポジトリ」で適切なオプションを選択します。
デプロイメント時に要求された場合次の選択をします。「メタデータ・リポジトリ」セクションで、次および図7-13に示すようにリポジトリおよびパーティション名を選択します。
リポジトリ名: mds-ESS_MDS_DS
パーティション名: essUserMetadata
「デプロイ」をクリックします。
デプロイメント・ログを使用してデプロイメントを確認します。
EssDemoAppサンプル・アプリケーションを実行するには、ブラウザでEssDemoサーブレットにアクセスします。
EssDemoサーブレットにアクセスする手順は、次のとおりです。
Oracle Enterprise Schedulerアプリケーションをビルドおよびデプロイする場合、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)の2つの分割されたアプリケーションを使用できます。この設計を使用する場合、各アプリケーションは、このような分割構成をサポートするオプションを使用して構成およびデプロイする必要があります。
さらに、一部のOracle Enterprise Schedulerデプロイメントでは、ホスティング・アプリケーションと発行元アプリケーションに別のOracle WebLogic Serverを使用します。このデプロイメント・オプションでは、発行元アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serverにデプロイされます。Oracle Enterprise Schedulerの発行者アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serversで実行される場合は、発行元アプリケーションがホスティング・アプリケーションを検出できるようにホスティング・アプリケーションのOracle WebLogic Serverを構成する必要があります。
注意:
この項では、新しいアプリケーションを作成します。「EssDemoAppアプリケーションのアプリケーションおよびプロジェクトの作成」で開始する項で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ジョブ・サポート」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。
これらの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
「Java設定の構成」ページで、デフォルト・パッケージをoracle.apps.ess.howto
に変更し、「次へ」をクリックします。
「EJB設定の構成」ページで、「ejb-jar.xmlをこのプロジェクトで生成します」を選択し、「次へ」をクリックします。
「ESSホスト・サポート設定の構成」ページで、「アプリケーションID」フィールドにEssDemoAppと入力します。
「終了」をクリックします。
EssDempAppRoleロールに割り当てられたユーザーを作成する必要があります。
バックエンドのホスティング・アプリケーションのセキュリティを構成する手順は、次のとおりです。
Oracle Enterprise Schedulerの分割されたアプリケーションを使用してジョブ・リクエストを発行するには、次を含むジョブ・リクエストを定義するメタデータを作成する必要があります。
ジョブ・タイプ: 実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。
ジョブ定義: Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。
バックエンドのホスティング・アプリケーションのメタデータを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
図7-18に示すように、「アイテム」領域で「ジョブ定義」を選択します。
図7-18 サンプル・アプリケーションへのジョブ定義の追加
「OK」をクリックします。「ジョブ定義の作成」ダイアログが表示されます。
「ジョブ定義の作成」ダイアログで、次を指定します(図7-19を参照)。
「名前」フィールドに、ジョブ定義の名前を入力します。この例では、名前HelloWorldJobDef
を入力します。
「パッケージ」フィールドに、パッケージ名を入力します。この例では、oracle/apps/ess/howto/metadata
と入力します。
「ジョブ・タイプ」フィールドで、ドロップダウン・リストから/oracle/as/ess/core/JavaJobTypeを選択します。
ドロップダウンにジョブ・タイプが表示されない場合は、「JDeveloperを起動してOracle Enterprise Schedulerアプリケーションのビルドをサポートする方法」の説明に従い、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が選択されていることを確認します。これは、「バックエンドのホスティング・アプリケーションのセキュリティの構成」で作成したロールです。
図7-20に示すように、「読取り」および「実行」を選択します。
「OK」をクリックします。
Oracle Enterprise Schedulerの制御の下でJavaクラスを実行するアプリケーションを定義するには、Oracle Enterprise Scheduler Executable
インタフェースを実装するJavaクラスを作成する必要があります。Executable
インタフェースでは、Oracle Enterprise Schedulerを使用したJavaクラスの呼出しを可能にする規定を指定します。
executeメソッドを実装する手順は、次のとおりです。
execute
メソッドを実装します。execute
メソッドは、Javaジョブの実行が開始される場所です。メソッド内のコードは、例7-4のように表示されます。例7-4 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プロパティの値を設定する手順は、次のとおりです。
EssDemoApp
と入力します。バックエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
バックエンドのアプリケーションをアセンブルするには、次を実行します:
EJB Javaアーカイブの作成
アプリケーションMARおよびEARファイルの作成
EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。
EJB-JARデプロイメント・プロファイルを作成する手順は、次のとおりです。
SuperEss META-INF/MANIFEST.INF
ファイルのコンテンツを次の行と置き換えます。
Manifest-Version: 1.0 Weblogic-Application-Version: 3.0 Extension-List: essruntime essruntime-Extension-Name: oracle.ess.runtime essruntime-Specification-Version: 12
ソース・エディタを使用して、weblogic-application.xml
から次の行を削除します。
WebLogicアプリケーションのパス:
EssDemoApp/src/META-INF/weblogic-application.xml
<library-ref> <library-name>oracle.applcp.runtime</library-name> </library-ref> <library-ref> <library-name>oracle.xdo.runtime</library-name> </library-ref>
アプリケーションをアセンブルした後、サーバーにデプロイできます。
バックエンドのホスティング・アプリケーションをデプロイする手順は、次のとおりです。
「アプリケーション・リソース」パネルで、次を行います。
adf-config.xml
ファイルのコンテンツを例7-5に示すXMLで置き換えます。例7-5 adf-config.xmlファイル
<?xml version="1.0" encoding="UTF-8" ?> <adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:config="http://xmlns.oracle.com/bc4j/configuration"> <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-adfm-config xmlns="http://xmlns.oracle.com/adfm/config"> <defaults changeEventPolicy="ppr" useBindVarsForViewCriteriaLiterals="true" useBindValuesInFindByKey="true"/> <startup> <amconfig-overrides> <config:Database jbo.locking.mode="optimistic"/> </amconfig-overrides> </startup> </adf-adfm-config> <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config"> <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config"> <persistence-config> <metadata-namespaces> <namespace path="/oracle/as/ess/core" metadata-store-usage="ess-core"/> </metadata-namespaces> <metadata-store-usages> <metadata-store-usage id="ess-core" deploy-target="false" default-cust-store="false"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/> <property name="repository-name" value="mds-ESS_MDS_DS"/> <property name="partition-name" value="essapp-internal-partition"/> </metadata-store> </metadata-store-usage> </metadata-store-usages> </persistence-config> </mds-config> </adf-mds-config> </adf-config>
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でバックエンドのホスティング・アプリケーションの場合に使用したのと同様の手順を使用します。
フロントエンドの発行者アプリケーションを作成する手順は、次のとおりです。
ESSDemoAppUI
を使用します。ESSホスト・サポートの設定を構成する場合は、「アプリケーションID」フィールドに、必ずEssDemoAppと入力してください。サーブレットのWebプロジェクトを作成する必要があります。
SuperWebプロジェクトを作成する手順は、次のとおりです。
SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「プロジェクト」→「カスタム・プロジェクト」を選択して、「OK」をクリックします。
「プロジェクトの名前付け」ウィンドウで、作成するホスト・プロジェクトの名前を入力し、サポートするテクノロジを選択します。このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。
「プロジェクト名」フィールドに、ホストするプロジェクトの名前を入力します。このサンプル・アプリケーションの場合は、SuperWeb
と入力します。
「プロジェクトの機能」タブの「選択可能」で、ESSクライアント・サポート、「JSPおよびサーブレット」をダブルクリックして、これらがダイアログ・ボックスの右側にある「選択済」に表示されるようにします。
ESSクライアント・サポートの詳細は、「Oracle JDeveloperによって作成されたOracle Enterprise Schedulerアプリケーション・サポートの理解」を参照してください。
「次へ」をクリックします。
Java設定の構成ウィンドウの「デフォルト・パッケージ」フィールドで、oracle.apps.ess.howto
を入力します。「次へ」をクリックします。
EJB設定の構成ウィンドウの「EJBのバージョン」で、「Enterprise JavaBeans 3.0」オプション・ボタンを選択します。
EJB設定の構成ウィンドウの「EJBのバージョン」で、「ejb-jar.xmlをこのプロジェクトで生成します」チェック・ボックスを選択します。
「終了」をクリックします。
アプリケーションのセキュリティを構成する必要があります。EssDemoAppUIアプリケーションはEssDemoAppアプリケーションによって作成されたユーザーおよびロールを共有するため、ユーザーやロールを作成する必要はありません。
フロントエンドの発行者アプリケーションのセキュリティを構成する手順は、次のとおりです。
通常は、Oracle Application Development Frameworkなどの重量フレームワーク上に作成されるより複雑なユーザー・インタフェースが使用されますが、簡単にするために、発行者アプリケーションには基本のHTTPサーブレットを使用します。
フロントエンドの発行者アプリケーションのHTTPサーブレットを作成する手順は、次のとおりです。
「クラス」
フィールドにEssDemoAppServletと入力します。oracle.apps.ess.howto
と入力し、「次へ」をクリックします。ESSDemoAppServlet.java
のコンテンツを例7-6に示すコードで置き換えます。例7-6 フロントエンドの発行者アプリケーションの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 is the reqID), and * match it to the value (Purge or Cancel). * Assumptions are that there is only one entry in the map * per request (one purge or cancel). Also, that the datatypes * for the key and value are 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 is 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 appears 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ファイルを編集する手順は、次のとおりです。
weblogic-application.xmlファイルを作成し、編集する必要があります。
フロントエンドの発行者アプリケーションのweblogic-application.xmlファイルを編集する手順は、次のとおりです。
weblogic-application.xml
ファイルのコンテンツを例7-7に示すXMLで置き換えます。例7-7 フロントエンドの発行者アプリケーションの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 uses 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-config.xml
ファイルのコンテンツを例7-8に示すXMLで置き換えます。例7-8 フロントエンドの発行者アプリケーションのadf-config.xmlにコピーするコンテンツ
<?xml version="1.0" encoding="UTF-8" ? > <adf-config xmlns="http://xmlns.oracle.com/adf/config" xmlns:sec="http://xmlns.oracle.com/adf/security/config"> <sec:adf-security-child xmlns="http://xmlns.oracle.com/adf/security/config"> <CredentialStoreContext credentialStoreClass="oracle.adf.share.security.providers.jps.CSFCredentialSto re" credentialStoreLocation="../../src/META-INF/jps-config.xml"/> sec:JaasSecurityContext initialContextFactoryClass="oracle.adf.share.security.JAASInitialContextFactor y" jaasProviderClass="oracle.adf.share.security.providers.jps.JpsSecurityContext" . authorizationEnforce="false" authenticationRequire="true"/ </sec:adf-security-child> <adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config"> <mds-config version="11.1.1.000" xmlns="http://xmlns.oracle.com/mds/config"> <type-config> <type-definitions> <classpathschema/Exclusion.xsd/classpath> <classpathschema/Incompatibility.xsd/classpath> <classpathschema/JobDefinition.xsd/classpath> <classpathschema/JobSet.xsd/classpath> <classpathschema/JobType.xsd/classpath> <classpathschema/Schedule.xsd/classpath> <classpathschema/Specialization.xsd/classpath> <classpathschema/Trigger.xsd/classpath> <classpathschema/TriggerExpression.xsd/classpath> <classpathschema/WorkAssignment.xsd/classpath> <classpathschema/Workshift.xsd/classpath> </type-definitions> </type-config> <persistence-config> <metadata-namespaces> <namespace path="/oracle/as/ess/core" metadata-store-usage="ess-core"/> namespace path="/oracle/apps/ess" metadata-store-usage="demo-app"/> </metadata-namespaces> <metadata-store-usages> <metadata-store-usage id="ess-core" deploy-target="false" default-cust-store="false"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/> <property name="repository-name" value="mds-ESS_MDS_DS"/> <property name="partition-name" value="essapp-internal-partition"/> </metadata-store> </metadata-store-usage> metadata-store-usage id="demo-app" deploy-target="true" default-cust-store="false"> <metadata-store class-name="oracle.mds.persistence.stores.db.DBMetadataStore"> <property name="jndi-datasource" value="jdbc/mds-ESS_MDS_DS"/> <property name="repository-name" value="mds-ESS_MDS_DS"/> <property name="partition-name" value="essUserMetadata"/> </metadata-store> </metadata-store-usage> </metadata-store-usages> </persistence-config> </mds-config> </adf-mds-config> </adf-config>
フロントエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
フロントエンドのアプリケーションをアセンブルするには、次を実行します:
EJB Javaアーカイブの作成
WARファイルの作成
アプリケーションMARおよびEARファイルの作成
EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。
フロントエンドの発行者アプリケーションのEJB JARファイルをアセンブルする手順は、次のとおりです。
JAR_SuperEssEjbJar
に設定します。WebアプリケーションのWebアーカイブ・ファイルを作成する必要があります。
フロントエンドの発行者アプリケーションのWARファイルをアセンブルする手順は、次のとおりです。
WAR_SuperWebWar
に設定します。ESSDemoAppUI
と入力します。サンプル・アプリケーションには、EssDemoAppのバックエンドのアプリケーションをアセンブルするMARプロファイルおよびEARファイルが含まれている必要があります。
フロントエンドの発行者アプリケーションのMARおよびEARファイルを作成する手順は、次のとおりです。
MAR_EssDemoAppUIMar
と入力し、「OK」をクリックします。EAR_EssDemoAppUIEar
と入力し、「OK」をクリックします。「アプリケーション名」
フィールドにEssDemoAppUIと入力します。WAR_SuperWebWar
を選択します。「MAR_ESSDemoAppUIMar」
を選択して「JAR_SuperEssEjbJar」
を選択します。「プロジェクト・プロパティ」→「SuperWeb」→「ライブラリとクラスパス」ウィンドウに移動します。「ライブラリの追加」ボタンを使用して、次のライブラリを追加します。
ADF共通ランタイム
ADF Facesランタイム11
ADF共通Webランタイム
ADFページ・フロー・ランタイム
ADFコントローラ・スキーマ
ADFコントローラ・ランタイム
ソース・エディタを使用して、weblogic-application.xml
から次の行を削除します。
<library-ref <library-name>oracle.xdo.runtime</library-name> </library-ref> <library-ref> <library-name>oracle.applcp.runtime</library-name> </library-ref>
アプリケーションをアセンブルした後、サーバーにデプロイできます。
フロントエンドの発行者アプリケーションをデプロイする手順は、次のとおりです。
EssHost META-INF/MANIFEST.INF
ファイルのコンテンツを次の行と置き換えます。
Manifest-Version:1.0 Weblogic-Application-Version: 3.0 Extension-List: essruntime essruntime-Extension-Name: oracle.ess.runtime essruntime-Specification-Version: 12