この章は、Oracle Enterprise Schedulerを使用してジョブ・リクエストを実行するアプリケーションを作成および実行する方法について説明し、Oracle Enterprise Schedulerを使用するアプリケーションをOracle JDeveloperで作成する方法を示します。
|
注意: この章には、古いリリースのOracle JDeveloperを使用するチュートリアルが含まれています。この内容は非推奨です。現在のバージョンのOracle JDeveloperを使用した開発については、第4章「Oracle JDeveloperを使用したOracle Enterprise Schedulerアプリケーションの生成」を参照してください。 |
次に、この章では2つの分割されたアプリケーションである、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)を使用する、サンプル・アプリケーションのバリエーションを示します。
この章では、次の項目について説明します。
Oracle Enterprise Schedulerサンプル・アプリケーションには、Oracle Enterprise Scheduler APIを使用してOracle JDeveloperでビルドする完全なアプリケーションが含まれます。Oracle Enterprise Schedulerを使用すると、Javaクラス、PL/SQLプロシージャおよびプロセス・タイプのジョブなど、様々なタイプのジョブ・リクエストを実行できます。ジョブ・リクエストをスケジュールするアプリケーションを作成するには、次を実行する必要があります:
スケジュール対象のルーチンを指定してOracle Enterprise Schedulerで実行する、Javaクラス、PL/SQLプロシージャまたは実行可能プロセスを作成します。
Oracle Enterprise Schedulerメタデータおよびジョブ・リクエストの特性を指定します。
Oracle Enterprise Scheduler APIを使用してジョブ・リクエストを指定および発行するJavaアプリケーションを定義します。
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 JDeveloperを使用して、アプリケーションおよびアプリケーションのコードとサポート・ファイルを含むアプリケーション内のプロジェクトを作成します。サンプル・アプリケーションを作成するには、次を実行する必要があります:
Oracle JDeveloperでアプリケーションを作成します。
Oracle JDeveloperでプロジェクトを作成します。
Oracle Enterprise Scheduler APIを使用するアプリケーション・コードを作成します。サンプル・アプリケーションのために、EssDemoAppアプリケーション内にEssDemoサーブレットを作成します。
|
注意: この章には、古いリリースのOracle JDeveloperを使用するチュートリアルが含まれています。この内容は非推奨です。現在のバージョンのOracle JDeveloperを使用した開発については、第4章「Oracle JDeveloperを使用したOracle Enterprise Schedulerアプリケーションの生成」を参照してください。 |
Oracle Enterprise Schedulerを使用するには、最初に、Oracle JDeveloperでアプリケーションおよびプロジェクトを作成します。
EssDemoアプリケーションを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、「新規アプリケーション...」を選択します。
「アプリケーションの名前付け」ウィンドウで、新規アプリケーションの名前と場所を入力します。
「アプリケーション名」フィールドで、アプリケーション名を入力します。このサンプル・アプリケーションの場合は、EssDemoAppと入力します。
「ディレクトリ」フィールドで、デフォルトを使用します。
アプリケーション・パッケージ接頭辞を入力するか、またはデフォルトである接頭辞なしを受け入れます。
接頭辞に続いてピリオドが、アプリケーションの初期プロジェクト内に作成されたオブジェクトに付加されます。
「アプリケーション・テンプレート」領域で、「Fusion Webアプリケーション(ADF)」を選択します。
「次へ」をクリックします。
「終了」をクリックします。
図5-1に示すように、「ファイル・サマリー」ページが表示されます。
Fusion Web Application (ADF)テンプレートを使用してアプリケーションを作成すると、「モデル」および「ViewController」という名前の2つのプロジェクト(Oracle ADFはこれらの領域を含むMVCデザイン・パターンに基づきます)が、Oracle JDeveloperによってアプリケーションに追加されます。Oracle Enterprise Schedulerアプリケーションを編成するには、別のプロジェクトを追加し、このプロジェクトを使用してOracle Enterprise Schedulerメタデータ、およびOracle Enterprise Schedulerで実行するJavaクラスのOracle Enterprise Scheduler実装を追加します。
プロジェクトを作成する手順は、次のとおりです。
EssDemoAppアプリケーションの「アプリケーション・メニュー」から、「新規プロジェクト...」を選択します。
「新規ギャラリ」の「カテゴリ」で「一般」を開き、「プロジェクト」を選択します。
図5-2に示すように、「アイテム」領域で「ADFモデル・プロジェクト」を選択します。
「OK」をクリックします。
「プロジェクトの名前付け」ページでプロジェクトの名前を入力します。たとえば、図5-3に示すように、プロジェクト名としてEssDemoと入力します。
「終了」をクリックします。
プロジェクトのOracle JDeveloperリソース・オプションを構成します。
「アプリケーション・ナビゲータ」で、EssDemoプロジェクトを選択します。
右クリックしてドロップダウン・リストから「プロジェクト・プロパティ...」を選択します。
「プロジェクト・プロパティ」ウィンドウのナビゲータで「プロジェクトのソース・パス」を開き、「リソース」を選択します。
図5-4に示すように、「対象」タブを選択して「サブフォルダからのコンテンツを含める」チェック・ボックスを選択します。
「OK」をクリックします。
Oracle Enterprise Scheduler APIを使用するには、その前に、プロジェクトにOracle Enterprise Schedulerの拡張機能を追加する必要があります。
Oracle JDeveloperでOracle Enterprise Schedulerの拡張機能を使用できるようにする手順は、次のとおりです。
Oracle JDeveloperの「アプリケーション・ナビゲータ」で、EssDemoプロジェクトを選択します。
右クリックしてドロップダウン・リストから「プロジェクト・プロパティ...」を選択します。
「プロジェクト・プロパティ」のナビゲータで、「ライブラリとクラスパス」を選択します。
「ライブラリとクラスパス」領域で、「ライブラリの追加...」をクリックします。
「ライブラリの追加」ダイアログの「ライブラリ」領域で、エンタープライズ・スケジューラ拡張機能を選択します。
「ライブラリの追加」ダイアログで「OK」をクリックします。図5-5に示すように、適切なライブラリが追加されます。
図5-5 プロジェクトへのOracle Enterprise Scheduler拡張機能の追加

「OK」をクリックして「プロジェクト・プロパティ」ダイアログを閉じます。
Oracle Enterprise Schedulerの制御の下でJavaクラスを実行するアプリケーションを定義するには、Oracle Enterprise Scheduler Executableインタフェースを実装するJavaクラスを作成する必要があります。Executableインタフェースでは、Oracle Enterprise Schedulerを使用したJavaクラスの呼出しを可能にする規定を指定します。
Executableインタフェースを実装するJavaクラスは空のexecute()メソッドを提供する必要があります。
executableインタフェースを実装するJavaクラスを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssDemoプロジェクトを選択します。
図5-6に示すように、「概要」領域で「Javaクラス」ナビゲーション・タブを選択します。
「概要」領域の「Javaファイル」領域で「新規」を選択し、ドロップダウン・リストから「Javaクラス」を選択します。
「プロジェクトの選択」ダイアログで、EssDemo.jprプロジェクトを選択します。
「OK」をクリックします。「Javaクラスの作成」ダイアログが表示されます。
「Javaクラスの作成」ダイアログの「名前」フィールドに、HelloWorldと入力します。
「Javaクラスの作成」ウィンドウの「パッケージ」フィールドに、essdemoと入力します。
図5-7に示すように、その他のフィールドではデフォルトを使用します。
「OK」をクリックします。
例5-1に示すように、生成されたHelloWorld.javaファイルのコンテンツをサンプルに用意されているHelloWorld.javaのコンテンツで置き換えます。図5-8にも、このコードを示します。
例5-1に、インタフェースoracle.as.scheduler.Executableを実装するJavaクラスHelloWorld()を示します。
例5-1 Oracle Enterprise SchedulerのHelloWorld Javaクラス
package essdemo;
import oracle.as.scheduler.RequestParameters;
import oracle.as.scheduler.Executable;
import oracle.as.scheduler.ExecutionCancelledException;
import oracle.as.scheduler.ExecutionErrorException;
import oracle.as.scheduler.ExecutionPausedException;
import oracle.as.scheduler.ExecutionWarningException;
import oracle.as.scheduler.RequestExecutionContext;
public class HelloWorld implements Executable {
public HelloWorld() {
}
public void execute(RequestExecutionContext ctx, RequestParameters params)
throws ExecutionErrorException,
ExecutionWarningException,
ExecutionCancelledException,
ExecutionPausedException
{
System.out.println("**** Sample Job Running, Request ID: " +
ctx.getRequestId());
}
}
Oracle Enterprise Schedulerを使用するには、Javaクラスを作成する必要があります。Oracle Enterprise SchedulerのExecutableインタフェースには、Oracle Enterprise Schedulerに提供したJavaクラスを使用するためのフックがあります。Executableインタフェースを実装するJavaクラスは、実行のためにOracle Enterprise Schedulerに対して発行できます。
Executableインタフェースを実装するクラスを作成する場合は、特定のプラクティスに従い、コードが正確に実行されることを確認する必要があります。これらのプラクティスを使用すると、Oracle Enterprise Schedulerの例外を処理できます。
|
注意: ジョブ・リクエストが実行されるたびに、Oracle Enterprise Schedulerによって |
例5-1では、次のことに注意してください。
ルーチンは、リカバリできないエラーが実行中に発生したことをOracle Enterprise Schedulerランタイムに通知するためにExecutionErrorExceptionをスローする必要があります。たとえば、この例外による実行中に生成された例外をラップできます。この例外が発生すると、Oracle Enterprise Schedulerによって、リクエストがERROR状態に遷移します。実装でOracle Enterprise Schedulerに通知する必要がある障害の状態が検出された場合、ルーチンはExecutionWarningExceptionをスローする必要があります。この例外が発生すると、Oracle Enterprise Schedulerによって、リクエストがWARNING状態に遷移します。実装でOracle Enterprise Schedulerに通知する必要があるリクエスト取消しの状態が検出された場合、ルーチンはExecutionCancelledExceptionをスローする必要があります。この例外が発生すると、Oracle Enterprise Schedulerによって、リクエストがCANCELLED状態に遷移します。
このExecutableインタフェースを実装するクラスが、サブリクエストの完了のために一時停止する必要があることを示すために、ルーチンはExecutionPausedExceptionをスローする必要があります。この例外が発生すると、Oracle Enterprise Schedulerによって、リクエストがPAUSED状態に遷移します。
Oracle Enterprise Schedulerアプリケーションでは、アプリケーションのいずれかのコンポーネントからジョブ・リクエストを発行するために、Oracle Enterprise Scheduler APIを使用します。EssDemoAppサンプル・アプリケーションには、(Oracle Enterprise Schedulerを使用して)ジョブ・リクエストを発行するための、サーブレット・ベースのユーザー・インタフェース用のJavaサーブレットが用意されています。
サーブレットでOracle Enterprise Scheduler APIを使用するには、その前に、ViewControllerプロジェクトにEJB3.0ライブラリおよびOracle Enterprise Schedulerの拡張機能を追加する必要があります。
Oracle JDeveloper EJB3.0およびOracle Enterprise Schedulerライブラリを追加する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でViewControllerプロジェクトを選択します。
右クリックしてドロップダウン・リストから「プロジェクト・プロパティ...」を選択します。
「プロジェクト・プロパティ」のナビゲータで、「ライブラリとクラスパス」を選択します。
「ライブラリとクラスパス」領域で、「ライブラリの追加...」をクリックします。
「ライブラリの追加」ダイアログでエンタープライズ・スケジューラ拡張機能を選択します。
「ライブラリの追加」ダイアログで「EJB 3.0」も選択します。
「OK」をクリックします。このアクションにより、図5-9に示すように、ライブラリが追加されます。
「OK」をクリックして「プロジェクト・プロパティ」ダイアログを閉じます。
MVCデザイン・パターンを使用して、ViewControllerプロジェクトにEssDemoサーブレットを作成します。
サンプル・サーブレットを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でViewControllerプロジェクトを選択します。
「新規...」アイコンをクリックして「新規ギャラリ」を開きます。
「新規ギャラリ」の「カテゴリ」領域で、「Web層」を開いて「サーブレット」を選択します。
「新規ギャラリ」の「アイテム」領域で、「HTTPサーブレット」を選択します。
「OK」をクリックします。「HTTPサーブレット作成」ウィザードが起動します。
「HTTPサーブレット作成 - ようこそ」ページで、「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ1/3: サーブレット情報」ページで、「クラス」フィールドにクラス名を入力します。この例では、「クラス」フィールドにEssDemoと入力します。
「パッケージ」フィールドにパッケージ名を入力します。この例では、「パッケージ」フィールドにdemoと入力します。
「作成するコンテンツ・タイプ」フィールドで、ドロップダウン・リストから「HTML」を選択します。
図5-10に示すように、「実装するメソッド」領域で、「doGet()」および「doPost()」チェック・ボックスを選択します。
「次へ」をクリックします。
「HTTPサーブレット作成 - ステップ2 / 3: マッピング情報」ダイアログの「名前」フィールドに、EssDemoと入力します。
図5-11に示すように、「HTTPサーブレット作成 - ステップ2 / 3: マッピング情報」ダイアログの「URLパターン」フィールドに、/essdemo/*と入力します。
「終了」をクリックします。
提供されたEssDemoアプリケーションには、完了したサーブレットが含まれています。ソース・コードをプロジェクトにコピーする必要があります。これを行うには、図5-12に示すように、Oracle JDeveloperでサーブレットのコンテンツをサンプル・アプリケーションに用意されているファイルEssDemo.javaのコンテンツで置き換えます。EssDemo.javaサンプル・コードには、数百行が含まれているため、この例のテキストでは示されていません。
Oracle Enterprise Schedulerのサンプル・アプリケーションを使用してジョブ・リクエストを発行するには、次を含むジョブ・リクエストを定義するメタデータを作成する必要があります。
ジョブ・タイプ: 実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。
ジョブ定義: Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。
Oracle Enterprise Schedulerのジョブ・タイプでは、実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。
ジョブ・タイプを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssDemoプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。
「新規ギャラリ」の「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
図5-13に示すように、「新規ギャラリ」の「アイテム」領域で、「ジョブ・タイプ」を選択します。
「OK」をクリックします。「ジョブ・タイプの作成」ダイアログが表示されます。
「ジョブ・タイプの作成」ダイアログで、次を指定します。
「名前」フィールドに、ジョブ・タイプの名前を入力します。この例では、名前Jobtype_essdemo1を入力します。
「パッケージ」フィールドに、パッケージ名を入力します。たとえば、mypackageと入力します。
図5-14に示すように、「実行タイプ」フィールドで、ドロップダウン・リストから「JAVA_TYPE」を選択します。
「OK」をクリックします。Jobtype_essdemo1.xmlファイルが作成され、Oracle JDeveloperで「ジョブ・タイプ」ページが表示されます。
「ジョブ・タイプ」ページの「説明」フィールドに、ジョブ・タイプの説明を入力します。この例では、Sample Java Job Typeと入力します。
「クラス名」フィールドで、「参照」アイコンをクリックします。
「階層」タブをクリックし、ナビゲートして適切なクラスを選択します。このサンプル・アプリケーションでは、essdemo.HelloWorldを選択します。「OK」をクリックします。
図5-15に示すように、「ジョブ・タイプ」ページが表示されます。
|
ヒント: ジョブ・クラスはジョブ・タイプ・レベルまたはジョブ定義レベルのいずれかで追加できます。 |
Oracle Enterprise SchedulerでJavaクラスを使用するには、ジョブ定義を作成する必要があります。ジョブ定義は、Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。
ジョブ定義を作成する場合は、名前を指定し、ジョブ・タイプを選択してシステム・プロパティを指定します。
ジョブ定義を作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssDemoプロジェクトを選択します。
[Ctrl]キーを押しながら[N]キーを押します。「新規ギャラリ」が表示されます。
「新規ギャラリ」の「カテゴリ」領域で「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」を選択します。
「新規ギャラリ」の「アイテム」領域で「ジョブ定義」を選択します。
「OK」をクリックします。Oracle JDeveloperで「ジョブ定義の作成」ダイアログが表示されます。
「ジョブ定義の作成」ダイアログを使用して、次を指定します。
ジョブ定義の名前を入力するか、デフォルトの名前をそのまま使用します。たとえば、サンプル・アプリケーションでは、Job_essdemo1と入力します。
「パッケージ」フィールドに、パッケージ名を入力します。たとえば、mypackageと入力します。
「ジョブ・タイプ」フィールドで、ドロップダウン・リストから値を選択します。たとえば、サンプル・アプリケーションでは、図5-16に示すように、以前に作成したジョブ・タイプJobtype_essdemo1を選択します。
「OK」をクリックします。図5-17に示すように、ジョブ定義Job_essdemo1.xmlおよびジョブ・フォルダが「mypackage」に作成され、「ジョブ定義」ページが表示されます。
「システム・プロパティ」フィールドで、追加ボタンをクリックしてEffectiveApplicationというシステム・プロパティを作成します。この値を、第5.6.1項「Oracle Enterprise Schedulerサンプル・アプリケーションのEJB Jarファイルをアセンブルする方法」で使用されている値に設定します。
サンプル・アプリケーションを作成した後、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ファイルを追加します。
ejb-jar.xmlファイルの作成: これにより、Oracle Enterprise Scheduler EJBおよび関連するリソースの説明が提供されます。Oracle Enterprise Schedulerのリクエスト発行、処理、メタデータおよびアプリケーションのランタイム・データのコンテキストは、デプロイメント名を使用して、Oracle Enterprise Schedulerクライアント・アプリケーションの名前として指定されます。例5-4に示すように、applicationNameプロパティを使用してコンテキストを指定することもできます。
weblogic-ejb-jar.xmlファイルの作成: これにより、Oracle Enterprise Scheduler EJBおよび関連するリソースのOracle WebLogic Server固有の説明が提供されます。
EJB JARアーカイブの作成: これには、Javaジョブ実装のディスクリプタが含まれます。
Java実装プロジェクトでejb-jar.xmlファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でEssDemoプロジェクトを選択します。
「新規...」アイコンをクリックします。
「新規ギャラリ」のナビゲータで「一般」を開き、「デプロイメント・ディスクリプタ」を選択します。
「新規ギャラリ」の「アイテム」領域で、「Java EEデプロイメント・ディスクリプタ」を選択します。
「OK」をクリックします。
「ディスクリプタの選択」ページでejb-jar.xmlを選択します。
「次へ」をクリックします。
「バージョンを選択」ページで3.0を選択します。
「終了」をクリックします。
図5-18に示すように、EssDemoプロジェクトにejb-jar.xmlファイルおよびMETA-INFディレクトリが作成されます。
作成したejb-jar.xmlファイルのコンテンツ全体を、サンプル・アプリケーションに用意されているejb-jar.xmlのコピーで置き換えます。図5-2に、このサンプルejb-jar.xmlファイルを示します。
例5-2 ejb-jar.xmlにコピーするEJBコンテンツ
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<display-name>ESS</display-name>
<enterprise-beans>
<message-driven>
<ejb-name>ESSAppEndpoint</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.EssAppEndpointBean</ejb-class>
</message-driven>
<session>
<description>Async Request Bean</description>
<ejb-name>AsyncRequestBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.AsyncRequestBean</ejb-class>
</session>
<session>
<description>Runtime Session Bean</description>
<ejb-name>RuntimeServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.RuntimeServiceBean</ejb-class>
</session>
<session>
<description>Metadata Session Bean</description>
<ejb-name>MetadataServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.MetadataServiceBean</ejb-class>
</session>
</enterprise-beans>
Java実装プロジェクトでweblogic-ejb-jar.xmlファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でEssDemoプロジェクトを選択します。
「新規...」アイコンをクリックします。
「カテゴリ」で「一般」を開き、「デプロイメント・ディスクリプタ」を選択します。
「アイテム」領域で「WebLogicデプロイメント・ディスクリプタ」を選択します。
「OK」をクリックします。
「ディスクリプタの選択」ダイアログで、weblogic-ejb-jar.xmlを選択します。
「次へ」をクリックします。
「次へ」をクリックします。
「終了」をクリックします。weblogic-ejb-jar.xmlファイルが作成されます。
weblogic-ejb-jar.xmlファイルのコンテンツ全体を、サンプル・アプリケーションに用意されているサンプルweblogic-ejb-jar.xmlで置き換えます。例5-3に、このファイルを示します。
例5-3 weblogic-ejb-jar.xmlファイルにコピーするEJBディスクリプタのコンテンツ
<?xml version="1.0" encoding="US-ASCII" ?>
<weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/10.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/10.0 http://www.bea.com/ns/weblogic/10.0/weblogic-ejb-jar.xsd">
<weblogic-enterprise-bean>
<ejb-name>ESSAppEndpoint</ejb-name>
<message-driven-descriptor>
<resource-adapter-jndi-name>ess/ra</resource-adapter-jndi-name>
</message-driven-descriptor>
<dispatch-policy>ESSRAWM</dispatch-policy>
</weblogic-enterprise-bean>
<run-as-role-assignment>
<role-name>essSystemRole</role-name>
<run-as-principal-name>weblogic</run-as-principal-name>
</run-as-role-assignment>
</weblogic-ejb-jar>
EJB JARアーカイブを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でEssDemoプロジェクトを選択します。
右クリックしてドロップダウン・リストから「EssDemo.jprのメイク」を選択します。メッセージ・ログに、次のようなコンパイル完了のメッセージが表示されることを確認します。
[3:40:22 PM] Successful compilation: 0 errors, 0 warnings.
「アプリケーション・ナビゲータ」でEssDemoプロジェクトを選択します。
「新規...」アイコンを選択します。
「新規ギャラリ」の「カテゴリ」領域で「一般」を開き、「デプロイメント・プロファイル」を選択します。
「新規ギャラリ」の「アイテム」領域で「EJB JARファイル」を選択します。
「OK」をクリックします。「デプロイメント・プロファイルの作成 -- EJB JARファイル」ダイアログが表示されます。
「デプロイメント・プロファイルの作成 -- EJB JARファイル」ダイアログで、「デプロイメント・プロファイル名」フィールドにess-ejbと入力します。
「OK」をクリックします。「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。
図5-19に示すように、「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「エンタープライズ・アプリケーション名」フィールドにEssDemoAppと入力します。
「EJB JARデプロイメント・プロファイルのプロパティ」ダイアログのナビゲータで、「ファイル・グループ」を開き、「プロジェクトの出力」を開いて「コントリビュータ」を選択します。
図5-20に示すように、「コントリビュータ」領域で「プロジェクトの出力ディレクトリ」および「プロジェクトの依存性」を選択します。
「EJB JARデプロイメント・プロパティ」ダイアログのナビゲータで、「ファイル・グループ」および「プロジェクトの出力」を開き、「フィルタ」を選択します。
図5-21に示すように、META-INFフォルダおよびessdemoフォルダを選択します。
「EJB JARデプロイメント・プロファイルのプロパティ」ページで、「OK」をクリックします。
「プロジェクト・プロパティ」ページで、「OK」をクリックします。
WARアーカイブ・オプションを更新する手順は、次のとおりです。
「アプリケーション・ナビゲータ」でViewControllerプロジェクトを選択します。
右クリックして「プロジェクト・プロパティ...」を選択します。
ナビゲータで、「デプロイメント」を選択します。
「デプロイメント」ページの「デプロイメント・プロファイル」領域で、「WARファイル」を選択します。
「編集...」をクリックします。「WARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」を選択し、図5-22に示すように「一般」ページを構成します。
「WARファイル」を設定します。path_to_mywork /mywork/EssDemoApp/ViewController/deploy/EssDemoApp_ViewController_webapp1.war
「Webアプリケーションのコンテキスト・ルート」領域で、「Java EE Webコンテキスト・ルートを指定」を選択します。
「Java EE Webコンテキスト・ルートを指定」のテキスト入力領域に、EssDemoAppと入力します。
「デプロイメント・クライアントの最大ヒープ・サイズ[単位:MB]」で、ドロップダウン・リストから「自動」を選択します。
「WARデプロイメント・プロファイルのプロパティの編集」ダイアログで「OK」をクリックします。
Oracle JDeveloperでデプロイメント・プロファイルが更新されます。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
アプリケーションでは、アプリケーション名にデフォルト値としてデプロイメント名を使用するか、またはejb-jar.xmlでプロパティapplicationNameを使用してアプリケーション名を設定できます。applicationNameを指定しない場合、デフォルトのアプリケーション名はデプロイメント名となります。
applicationNameを設定するには、図5-4に示すように、ejb-jar.xmlファイルを編集してapplicationNameという名前の<activation-config-property>の値を設定します。
例5-4 ejb-jar.xmlでのapplicationNameの設定
<enterprise-beans>
<message-driven>
<ejb-name>ESSAppEndpoint</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.EssAppEndpointBean</ejb-class>
<activation-config>
<activation-config-property>
<activation-config-property-name>
applicationName
</activation-config-property-name>
<activation-config-property-value>
MY_APPLICATION_NAME
</activation-config-property-value>
</activation-config-property>
</activation-config>
</message-driven>
<enterprise-beans>
サンプル・アプリケーションには、必要なMARプロファイルが含まれている必要があります。
MARファイルを作成する手順は、次のとおりです。
EssDemoAppアプリケーションを開き、「アプリケーション・メニュー」から「アプリケーションのプロパティ...」を選択します。
「アプリケーションのプロパティ」ダイアログのナビゲーションで「デプロイメント」を選択します。
デフォルトのデプロイメント・プロファイルを選択して削除します。
「新規...」をクリックします。「デプロイメント・プロファイルの作成」ページが表示されます。
図5-23に示すように、「アーカイブ・タイプ」フィールドで、ドロップダウン・リストから「MARファイル」を選択します。
「デプロイメント・プロファイルの作成」ダイアログで、「名前」フィールドに名前(たとえば、essMAR)を入力します。
「デプロイメント・プロファイルの作成」ダイアログで、「OK」をクリックします。
「MARデプロイメント・プロファイルの編集」ダイアログのナビゲータで「メタデータ・ファイル・グループ」を開き、「ユーザー・メタデータ」を選択します。
「追加...」をクリックします。「コントリビュータの追加」ダイアログが表示されます。
図5-24に示すように、「コントリビュータの追加」ダイアログで「参照」をクリックし、ジョブおよびジョブタイプのディレクトリのネームスペースを含むessmetaメタデータを追加します。essmetaディレクトリをダブルクリックして、「コントリビュータの追加」ダイアログに含める必要があるパスを選択することに注意してください。
「コントリビュータの追加」ダイアログで、「OK」をクリックします。
ナビゲータで「メタデータ・ファイル・グループ」および「ユーザー・メタデータ」を順に開いて「ディレクトリ」を選択します。
mypackageディレクトリを選択します。これにより、アプリケーションについてOracle Enterprise Schedulerアプリケーション・ユーザー・メタデータのすべての適切な情報が選択されます。
ツリーの最下部のディレクトリを選択します。これはネームスペースの作成元のディレクトリです。たとえば、oracleを選択した場合、ネームスペースはoracleになります。productディレクトリを選択した場合、ネームスペースはoracle/apps/productになります。たとえば、ネームスペースoracle/apps/product/component/essを作成するには、essディレクトリをクリックします。
このダイアログで選択するフォルダによって、adf-config.xmlの最上位レベルのネームスペースが決定されます。詳細は、第5.6.3項「Oracle Enterprise Schedulerサンプル・アプリケーションのEARファイルをアセンブルする方法」を参照してください。このネームスペースは、ジョブおよびジョブ・タイプ定義で定義されたパッケージと同じである必要があります。詳細は、第5.5項「Oracle Enterprise Schedulerサンプル・アプリケーションのメタデータの作成」を参照してください。
|
注意: ネームスペースが汎用的すぎる場合、Oracle ADFアプリケーションに障害が発生する可能性があります。適切なパッケージ構造を使用し、必要なネームスペースのみをマップするようにしてください。 |
「MARデプロイメント・プロファイルのプロパティの編集」ページで、「OK」をクリックします。
「アプリケーションのプロパティ」ページのナビゲータで「実行」を開き、「MDS」を選択します。
図5-25に示すように、作成したMARプロファイルessMARを選択します。
「OK」をクリックします。
サンプル・アプリケーションをアセンブルするEARファイルを準備する必要があります。EARアーカイブは次のもので構成されます。
Oracle Enterprise Scheduler Javaジョブ実装を含むEJB JAR。
EssDemoサーブレットを含むWARアーカイブ。
アプリケーションのEARファイルを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、EssDemoAppアプリケーションを選択します。
「アプリケーション・メニュー」から「アプリケーションのプロパティ...」を選択します。
「アプリケーションのプロパティ」のナビゲータで、「デプロイメント」を選択します。
「新規...」をクリックして新規デプロイメント・ディスクリプタを作成します。
「アーカイブ・タイプ」ドロップダウン・リストで、「EARファイル」を選択します。
「デプロイメント・プロファイルの作成」ダイアログで、「名前」フィールドにアプリケーション名を入力します。このアプリケーションの場合は、EssDemoAppと入力します。
「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲータで、「アプリケーション・アセンブリ」を選択します。
図5-26に示すように、「アプリケーション・アセンブリ」ページの「Java EEモジュール」領域で、次のような適切なチェック・ボックスを選択します。「essMAR」、ViewControllerプロジェクトのWEBモジュールおよびEssDemoプロジェクトのEJBモジュール「ess-ejb」。
「OK」をクリックします。
「アプリケーションのプロパティ」ページで、「OK」をクリックします。
weblogic-application.xmlファイルを更新してoracle.essライブラリを含める必要があります。
「アプリケーション・ナビゲータ」で「アプリケーション・リソース」を開きます。
図5-27に示すように、ナビゲータで「ディスクリプタ」および「META-INF」を順に開きます。
図5-27 「アプリケーション・リソース」でのweblogic-application.xmlの表示

weblogic-application.xmlファイルをダブルクリックして開きます。
weblogic-application.xmlファイルに次を追加します。例5-5に、この<library-ref>要素を含む完全なweblogic-application.xmlファイルを示します。
<library-ref>
<library-name>oracle.ess</library-name>
</library-ref>
例5-5 oracle.essを含むサンプル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">
<listener>
<listener-class>oracle.mds.lcm.weblogic.WLLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>oracle.adf.share.weblogic.listeners.ADFApplicationLifecycleListener</listener-class>
</listener>
<library-ref>
<library-name>adf.oracle.domain</library-name>
<implementation-version>11.1.1.1.0</implementation-version>
</library-ref>
<library-ref>
<library-name>oracle.ess</library-name>
</library-ref>
</weblogic-application>
サンプル・アプリケーションをビルドおよびアセンブルするステップを完了した後、Oracle WebLogic Serverにアプリケーションをデプロイする必要があります。アプリケーションを正常にデプロイした後、アプリケーションを実行できます。サンプル・アプリケーションでは、ブラウザを使用してEssDemoサーブレットを実行し、Oracle WebLogic Serverで実行中のOracle Enterprise Schedulerにジョブ・リクエストを発行します。
EssDemoAppアプリケーションをデプロイするには、正しく構成され実行されているOracle WebLogic Server、およびアクティブなメタデータ・サーバーが必要です。アプリケーションをデプロイすると、Oracle JDeveloperで「デプロイメント構成」ページが表示されます。ドロップダウン・リストからリポジトリを選択し、パーティション名を入力します(パーティション名はデフォルトでアプリケーション名に設定されます)。
EssDemoAppアプリケーションをデプロイする手順は、次のとおりです。
ラン・マネージャをチェックして、Oracle WebLogic Serverが起動され、実行中であることを確認します。Oracle WebLogic Serverが実行中でない場合は、サーバーを起動します。サーバーを起動するには、「実行」メニューから「サーバー・インスタンスの起動」をクリックします。
「アプリケーション・ナビゲータ」で、EssDemoAppアプリケーションを選択します。
図5-28に示すように、「アプリケーション・ナビゲータ」で「アプリケーション・メニュー」から、「デプロイ」→「EssDemoApp」→「デプロイ先」→「IntegratedWLSConnection」の順に選択します。
図5-29に示すように、Oracle JDeveloperで「デプロイメント構成」ページが表示されます。「メタデータ・リポジトリ」で適切なオプションを選択します。
「デプロイ」をクリックします。
デプロイメント・ログを使用してデプロイメントを確認します。
サンプル・アプリケーションを実行するには、ブラウザでEssDemoサーブレットにアクセスします。
EssDemoサーブレットにアクセスする手順は、次のとおりです。
ブラウザに次のURLを入力します。
http://host:http-port/context-root/essdemo
次に例を示します。
http://myserver.example.com:7101/EssDemoApp/essdemo
図5-30に示すように、EssDemoサーブレットが表示されます。
図5-30 Oracle Enterprise Schedulerサンプル・アプリケーションのEssDemoサーブレットの実行

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

この項では、一般的な問題とその問題の解決策について説明します。
問題: sqlplus: Command not found.
解決策: Oracle Databaseが含まれている環境でOracle Databaseコマンドを実行します。
問題: SP2-0310: unable to open file "createuser_ess_oracle.sql"
解決策: sqlplusスクリプトを実行する前に/rcu/integration/ess/sqlディレクトリに変更します。
問題:
404 Not Found Resource /EssDemoApp-ViewController-context-root/essdemo not found on this server
解決策: この問題および同様の問題は、アプリケーションにアクセスするためにURLのコンテキスト・ルートを設定したときに指定したルートURLと一致しないURLを使用していることが原因である可能性があります。デプロイしたアプリケーションと一致するコンテキスト・ルートを使用するには、指定した値を使用します。
WARアーカイブでコンテキスト・ルート値をチェックおよび設定する手順は、次のとおりです。
ViewControllerプロジェクトを選択します。
右クリックしてドロップダウン・リストから「プロジェクト・プロパティ」を選択します。
ナビゲータで、「デプロイメント」を選択します。
「デプロイメント・プロファイル」領域で、「essdemoapp」を選択して「編集」をクリックします。
使用するコンテキスト・ルートを選択します。これは、アプリケーションにアクセスするためのURLのコンテキスト・ルートとなります。
「一般」領域で、「Java EE Webコンテキスト・ルートを指定」を選択します。
「Java EE Webコンテキスト・ルート:」テキスト入力領域に、EssDemoAppと入力します。
「WARデプロイメント・プロファイルのプロパティ」ウィンドウで、「OK」をクリックします。
「プロジェクト・プロパティ」ウィンドウで、「OK」をクリックします。
問題: Unresolved application library references, defined in weblogic-application.xml: [Extension-Name: oracle.ess, exact-match: false]..
エラーが発生し、デプロイメントが失敗します。次に例を示します。
09:30:59 AM] Building... [09:31:00 AM] Deploying 2 profiles... [09:31:01 AM] Wrote Web Application Module to /scratch/sched7/mywork/EssDemoApp/ViewController/deploy/EssDemoApp_ViewController_webapp1.war [09:31:01 AM] removed bundleresolver.jar from APP-INF because it cannot be part of an EJB deployment[09:31:01 AM] Wrote Enterprise Application Module to /scratch/sched7/mywork/EssDemoApp/deploy/EssDemoApp_application1.ear [09:31:02 AM] Deploying Application... [09:31:04 AM] [Deployer:149193]Deployment of application 'EssDemoApp_application1' has failed on 'DefaultServer' [09:31:04 AM] [Deployer:149034]An exception occurred for task [Deployer:149026]deploy application EssDemoApp_application1 on DefaultServer.: [J2EE:160149]Error while processing library references. Unresolved application library references, defined in weblogic-application.xml: [Extension-Name: oracle.ess, exact-match: false].. [09:31:05 AM] Weblogic Server Exception: weblogic.management.DeploymentException: [J2EE:160149]Error while processing library references. Unresolved application library references, defined in weblogic-application.xml: [Extension-Name: oracle.ess, exact-match: false]. [09:31:05 AM] See server logs or server console for more details. [09:31:05 AM] weblogic.management.DeploymentException: [J2EE:160149]Error while processing library references. Unresolved application library references, defined in weblogic-application.xml: [Extension-Name: oracle.ess, exact-match: false]. [09:31:05 AM] #### Deployment incomplete. #### [09:31:05 AM] Deployment Failed
解決策: このデプロイメント・エラーは、アプリケーションは正しいが、Oracle WebLogic Server構成が正しくない場合に発生する可能性があります。構成には、手順3.1.4「WLSドメインの作成」が含まれます。この構成手順は必須です。
Oracle Enterprise Scheduler Oracle Databaseスキーマを作成する必要があります。Oracle Enterprise Schedulerでは、このスキーマを使用してジョブ・リクエストに関する情報を管理します。
|
注意: Oracle Fusion Applications環境では、この手順は必要ありません。この環境では、データベースは事前構成済のOracle Enterprise Schedulerスキーマとともにインストールされます。そのため、この環境ではこの手順をスキップできます。 |
Oracle Enterprise Schedulerデータベース・スキーマを作成するには、Oracle Enterprise Schedulerで使用するOracle JDeveloperをインストールする必要があります。詳細は、Oracle Fusion Applicationsインストレーション・ガイドを参照してください。
以前のバージョンのOracle Enterprise Schedulerランタイム・スキーマを実行していた場合、またはなんらかの理由でスキーマを削除する必要がある場合は、dropschema_ess_oracle.sqlスクリプトを使用して削除できます。
この手順は、Oracle Enterprise Schedulerランタイム・スキーマを削除する場合にのみ使用します。この手順では、特定のデータベース・オブジェクトをクリーン・アップしてからスキーマ・ユーザーを削除します。既存のスキーマを正しく削除するには、Oracle Enterprise Schedulerスキーマを削除するのみでは十分でないことに注意してください。
|
注意: 初めてインストールする場合は、この手順を実行する必要はありません。前のインストール・エラーが原因でデータベース・スキーマを削除する必要がある場合、または以前にOracle Enterprise Schedulerを使用した後にデータベースをクリーン・アップする必要がある場合にのみ、この手順を使用します。 |
データベース・スキーマを削除する手順は、次のとおりです。
Oracle Enterprise Schedulerスキーマを使用しているすべてのコンテナを終了します。
次のコマンドを使用して、ess/sqlディレクトリに変更します。
% cd JDEV_install_dir/rcu/integration/ess/sql
SYSまたはSYSDBAとして接続したら、次を実行します。テキストで、ess_schemaは削除するOracle Enterprise Schedulerスキーマを表します。
@dropschema_ess_oracle.sql ess_schema alter session set current_schema=sys; drop user ess_schema cascade;
ess_schemaがoraessの例を示します。
> @dropschema_ess_oracle.sql oraess > alter session set current_schema=sys; > drop user oraess cascade; > exit
Oracle Enterprise Schedulerアプリケーションをビルドおよびデプロイする場合、ジョブ発行アプリケーション(発行者)およびジョブ実行アプリケーション(ホスティング・アプリケーション)の2つの分割されたアプリケーションを使用できます。この設計を使用する場合、各アプリケーションは、このような分割構成をサポートするオプションを使用して構成およびデプロイする必要があります。さらに、一部のOracle Enterprise Schedulerデプロイメントでは、ホスティング・アプリケーションと発行元アプリケーションに別のOracle WebLogic Serverを使用します。このデプロイメント・オプションでは、発行元アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serverにデプロイされます。Oracle Enterprise Schedulerの発行者アプリケーションとホスティング・アプリケーションが別のOracle WebLogic Serversで実行される場合は、発行元アプリケーションがホスティング・アプリケーションを検出できるようにホスティング・アプリケーションのOracle WebLogic Serverを構成する必要があります。
|
注意: この章には、古いリリースのOracle JDeveloperを使用するチュートリアルが含まれています。この内容は非推奨です。現在のバージョンのOracle JDeveloperを使用した開発については、第4章「Oracle JDeveloperを使用したOracle Enterprise Schedulerアプリケーションの生成」を参照してください。 |
サンプルの分割されたアプリケーションをビルドするには、次を実行します:
スケジュールおよび実行されるコードを含むバックエンドのホスティング・アプリケーションをビルドします。
ジョブ・リクエストを開始するフロントエンドの発行者アプリケーションをビルドします。
Oracle JDeveloperを使用して、バックエンドのアプリケーションを作成します。バックエンドのサンプル・アプリケーションを作成するには、次を実行します:
バックエンドのアプリケーションおよびプロジェクトを作成します。
セキュリティを構成します。
デプロイメント・ディスクリプタを定義します。
Oracle Enterprise Schedulerのexecutableインタフェースを実装するJavaクラスを作成します。
ジョブを記述するOracle Enterprise Schedulerメタデータを作成します。
アプリケーションをアセンブルします。
アプリケーションをデプロイします。
分割されたアプリケーションでOracle Enterprise Schedulerを使用するには、Oracle JDeveloperを使用してバックエンドのアプリケーションおよびプロジェクトを作成し、Oracle Enterprise Schedulerの拡張機能をプロジェクトに追加します。
バックエンドのホスティング・アプリケーションを作成する手順は、次のとおりです。
JDeveloperのメイン・メニューから、「ファイル」→「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「アプリケーション」→「汎用アプリケーション」を選択し、「OK」をクリックします。
汎用アプリケーションの作成ウィザードの「アプリケーションの名前付け」ページで、「アプリケーション名」フィールドをEssDemoAppに設定します。
「プロジェクトの名前付け」ページで、「プロジェクト名」をSuperEssに設定します。
このプロジェクトは、Oracle Enterprise Schedulerメタデータの作成および保存先です。
プロジェクトに「EJB」テクノロジを追加します。
「プロジェクトJava設定」ページで、デフォルト・パッケージをoracle.apss.ess.howtoに変更します。
「EJB設定の構成」ページで「ejb-jar.xmlをこのプロジェクトで生成します」を選択し、「終了」をクリックします。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。
「プロジェクト・プロパティ」ダイアログで「プロジェクトのソース・パス」を開き、「リソース」ナビゲーション・タブをクリックします。
「サブフォルダからのコンテンツを含める」を選択します。
「ライブラリとクラスパス」ナビゲーション・タブを選択します。
「ライブラリの追加」をクリックし、エンタープライズ・スケジューラ拡張機能を選択して「OK」をクリックします。
EssDempAppRoleロールに割り当てられたユーザーを作成する必要があります。
バックエンドのホスティング・アプリケーションのセキュリティを構成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション」→「保護」→「ADFセキュリティの構成」の順に選択します。
「ADFセキュリティの構成」ウィザードの「ADFセキュリティ」ページで、「ADF認証」を選択します。
このアプリケーションには保護するWebモジュールがないため、「認証タイプ」ページでデフォルト値をそのまま使用します。
「終了」をクリックします。
jps-config.xmlという名前のファイルが生成されます。このファイルは、「アプリケーション・リソース」パネルで、「ディスクリプタ」→「META-INF」を開いて確認できます。このファイルには、アプリケーションに基づいて名前が付けられたセキュリティ・コンテキストまたはセキュリティ・ストライプが含まれています。
メイン・メニューから、「アプリケーション」→「保護」→「ユーザー」の順に選択します。
jps-config.xmlという名前のファイルが生成されます。
jps-config.xmlファイルの概要エディタで、「ユーザー」リストの「追加」アイコンをクリックします。
名前をEssDemoAppUserに設定し、パスワードをwelcome1に設定します。
「アプリケーション・ロール」ナビゲーション・タブをクリックします。
「ロール」リストの「追加」アイコンをクリックして、「新しいロールの追加」を選択します。
名前をEssDemoAppRoleに設定します。
「マッピング」タブで「追加」アイコンをクリックして、「ユーザーの追加」を選択します。
EssDemoAppUserを選択し、「OK」をクリックします。
サンプル・アプリケーションには、必要な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についての記述が含まれている必要があります。
Oracle Enterprise Schedulerのバックエンドのアプリケーションは、Oracle WebLogic Serverにデプロイされます。EssDemoAppアプリケーションをデプロイするには、Oracle JDeveloperでデプロイメント・プロファイルを作成する必要があります。
EssDemoAppは、Oracle Enterprise Scheduler Javaジョブを含むスタンドアロン・アプリケーションで、必要なOracle Enterprise Schedulerメタデータ、Oracle Enterprise Schedulerメッセージドリブンbean (MDB)およびアプリケーションのEJBディスクリプタを含みます。このアプリケーションでは、Oracle Enterprise Scheduler発行APIは実行されません。このホスティング・アプリケーションでは、発行はフロントエンドの発行者アプリケーションで実行されます。ホスティング・アプリケーションEssDemoAppでは、weblogic-ejb-jar.xmlによってEJBリモート・インタフェースがJNDIから公開されます(EJBリモート・インタフェースを使用すると、フロントエンドのアプリケーションでのジョブ発行が可能になります)。
また、oracle.essライブラリを含め、Oracle Enterprise Schedulerリスナーを追加し、jazn-data.xmlポリシーのアップロードに使用するストライプを示すweblogic-application.xmlファイルも作成する必要があります。
バックエンドのホスティング・アプリケーションのデプロイメント・ディスクリプタを定義する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で「SuperEss」→「アプリケーション・ソース」→「META-INF」の順に開き、「ejb-jar.xml」をダブルクリックします。
ファイルのコンテンツを、例5-6に示すXMLで置き換えます。
例5-6 バックエンドのホスティング・アプリケーションのejb-jar.xmlにコピーするコンテンツ
<?xml version = '1.0' encoding = 'UTF-8'?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<display-name>ESS</display-name>
<enterprise-beans>
<message-driven>
<ejb-name>ESSAppEndpoint</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.EssAppEndpointBean</ejb-class>
<activation-config>
<activation-config-property>
<!-- The "applicationName" property specifies the logical name used
- by Oracle Enterprise Scheduler to identify this application.
- This name is independent of the application name used when
- deploying the application to the container. This decoupling
- allows applications to safely hardcode the logical application
- name in source code without having to worry about the more
- frequently changed deployment name.
-
- Note: The name given here must also be specified in the
- SYS_effectiveApplication property of each job definition and
- job set of this application.
-->
<activation-config-property-name>applicationName</activation-config-property-name>
<activation-config-property-value>EssDemoApp</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<!-- The "applicationStripe" property specifies which JPS security
- stripe or "security context" Oracle Enterprise Scheduler should
- use to perform security checks.
-
- The value here must be the same as the "injection-target-name"
- value used by the "oracle.security.jps.ee.ejb.JpsInterceptor"
- interceptor descriptor below.
-
- Note: When creating jps-config.xml through JDev, it will create
- default security context using the JDev workspace name. In
- order to simplify things, we will use the JDev workspace name
- as our value. Otherwise, you will have to rename the security
- context created by JDev or create your own.
-->
<activation-config-property-name>applicationStripe
</activation-config-property-name>
<activation-config-property-value>EssDemoApp
</activation-config-property-value>
</activation-config-property>
</activation-config>
</message-driven>
<!-- The AsyncBean allows asynchronous Java jobs to notify
- Oracle Enterprise Scheduler of its status through Java EE EJB APIs.
- It is recommended to use the WebService callback pattern
- instead of the EJB callbacks wherever possible.
-->
<session>
<description>Async Request Bean</description>
<ejb-name>AsyncRequestBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.AsyncRequestBean</ejb-class>
</session>
<!-- The Runtime Service allows users to interact with an Executable.
- Operations include submitting, cancelling, querying, etc.
-->
<session>
<description>Runtime Session Bean</description>
<ejb-name>RuntimeServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.RuntimeServiceBean</ejb-class>
</session>
<!-- The Metadata Service allows user to interact with
- Oracle Enterprise Scheduler, metadata including job definitions,
- job sets, job types, schedules, and so on. Operations include reading,
- writing, querying, copying, deleting, and so on.
-->
<session>
<description>Metadata Session Bean</description>
<ejb-name>MetadataServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.MetadataServiceBean</ejb-class>
</session>
</enterprise-beans>
<!--
- The JPS interceptor is used by JPS (Java Platform Security) in order to
- perform security checks. The "stripe name" is usually associated with
- the application name but some groups split their security permissions
- between Oracle ADF grants and Oracle Enterprise Scheduler grants, creating
- two stripes.
- For example, the Oracle ADF grants would live in the "MyApp" stripe while
- the Oracle Enterprise Scheduler grants would live in the "MyAppEss".
-
- Note: For this example, we will use only 1 stripe.
-
- Note: When creating jps-config.xml through JDev, it will create
- default security context using the JDev workspace name. In
- order to simplify things, we will use the JDev workspace name
- as our value. Otherwise, you will have to rename the security
- context created by JDev or create your own.
-->
<interceptors>
<interceptor>
<interceptor-class>oracle.security.jps.ee.ejb.JpsInterceptor</interceptor-class>
<env-entry>
<env-entry-name>application.name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>EssDemoApp</env-entry-value>
<injection-target>
<injection-target-class>oracle.security.jps.ee.ejb.JpsInterceptor</injection-target-class>
<injection-target-name>application_name</injection-target-name>
</injection-target>
</env-entry>
</interceptor>
</interceptors>
</ejb-jar>
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「デプロイメント・ディスクリプタ」→「Weblogicデプロイメント・ディスクリプタ」を選択し、「OK」をクリックします。
「ディスクリプタの選択」ページでweblogic-ejb-jar.xmlを選択します。
「次へ>」をクリックし、再度「次へ>」をクリックして「終了」をクリックします。
ソース・エディタで、作成したweblogic-ejb-jar.xmlファイルのコンテンツを例5-7に示すXMLで置き換えます。
このXMLは、ejb-jar.xmlファイルのMDBをOracle Enterprise Schedulerリソース・アダプタに関連付けます。このXMLがない場合、アプリケーションでは処理対象を認識できません。
例5-7 バックエンドのホスティング・アプリケーションのweblogic-ejb-jar.xmlにコピーするコンテンツ
<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-ejb-jar
http://www.bea.com/ns/weblogic/weblogic-ejb-jar/1.0/weblogic-ejb-jar.xsd"
xmlns="http://www.bea.com/ns/weblogic/weblogic-ejb-jar">
<weblogic-enterprise-bean>
<ejb-name>ESSAppEndpoint</ejb-name>
<message-driven-descriptor>
<resource-adapter-jndi-name>ess/ra</resource-adapter-jndi-name>
</message-driven-descriptor>
<dispatch-policy>ESSRAWM</dispatch-policy>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「デプロイメント・ディスクリプタ」→「Weblogicデプロイメント・ディスクリプタ」を選択し、「OK」をクリックします。
「ディスクリプタの選択」ページでweblogic-application.xmlを選択します。
「次へ>」をクリックし、再度「次へ>」をクリックして「終了」をクリックします。
ソース・エディタで、作成したweblogic-application.xmlファイルのコンテンツを例5-8に示すXMLで置き換えます。
例5-8 バックエンドのホスティング・アプリケーションの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>EssDemoApp</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</library-name>
</library-ref>
</weblogic-application>
Oracle Enterprise Schedulerの制御の下でJavaクラスを実行するアプリケーションを定義するには、Oracle Enterprise Scheduler Executableインタフェースを実装するJavaクラスを作成する必要があります。Executableインタフェースでは、Oracle Enterprise Schedulerを使用したJavaクラスの呼出しを可能にする規定を指定します。
Executableインタフェースを実装するJavaクラスは空のexecute()メソッドを提供する必要があります。
executableインタフェースを実装するJavaクラスを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「Java」→「Javaクラス」を選択して「OK」をクリックします。
「Javaクラスの作成」ダイアログで、名前をHelloWorldJobに設定します。
パッケージをoracle.apps.ess.howtoに設定します。
「追加」アイコンをクリックしてoracle.as.scheduler.Executableインタフェースを追加し、「OK」をクリックします。
他のフィールドでは、デフォルトをそのまま使用します。
「OK」をクリックします。
ソース・エディタで、生成されたHelloWorldJob.javaファイルのコンテンツを例5-9に示すコードで置き換えます。
例5-9 Oracle Enterprise SchedulerのHelloWorldJob Javaクラス
package oracle.apps.ess.howto;
import java.util.logging.Logger;
import oracle.as.scheduler.Executable;
import oracle.as.scheduler.ExecutionCancelledException;
import oracle.as.scheduler.ExecutionErrorException;
import oracle.as.scheduler.ExecutionPausedException;
import oracle.as.scheduler.ExecutionWarningException;
import oracle.as.scheduler.RequestExecutionContext;
import oracle.as.scheduler.RequestParameters;
public class HelloWorldJob implements Executable {
public HelloWorldJob() {
super();
}
public void execute(RequestExecutionContext requestExecutionContext,
RequestParameters requestParameters)
throws ExecutionErrorException, ExecutionWarningException,
ExecutionCancelledException, ExecutionPausedException
{
printBanner(requestExecutionContext, requestParameters);
}
protected void printBanner(RequestExecutionContext requestExecutionContext,
RequestParameters requestParameters)
{
StringBuilder sb = new StringBuilder(1000);
sb.append("\n==================================");
sb.append("\n= EssDemoApp request is now running");
long myRequestId = requestExecutionContext.getRequestId();
sb.append("\n= Request Id = " + myRequestId);
sb.append("\n= Request Properties:");
for (String paramKey : requestParameters.getNames()) {
Object paramValue = requestParameters.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の分割されたアプリケーションを使用してジョブ・リクエストを発行するには、次を含むジョブ・リクエストを定義するメタデータを作成する必要があります。
ジョブ・タイプ: 実行タイプを指定し、ジョブ・リクエストのパラメータの共通セットを定義します。
ジョブ定義: Oracle Enterprise Schedulerでジョブ・リクエストを定義する基本作業単位です。
|
注意: Oracle Fusion Applicationsのユースケースの場合は、独自のものを作成するのではなく、事前にパッケージ化されているOracle Enterprise Schedulerのジョブ・タイプを使用します。独自のジョブ・タイプはデモ用に作成します。 |
バックエンドのホスティング・アプリケーションのメタデータを作成する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で、「すべてのテクノロジ」タブを選択します。
「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」→「ジョブ・タイプ」を選択して「OK」をクリックします。
「ジョブ・タイプの作成」ダイアログで、次を指定します。
「名前」フィールドにHelloWorldJobTypeと入力します。
「パッケージ」フィールドに、/oracle/apps/ess/howto/と入力します。
「実行タイプ」ドロップダウン・リストから「JAVA_TYPE」を選択します。
「OK」をクリックします。これにより、HelloWorldJobType.xmlファイルが作成され、Oracle JDeveloperのエディタでファイルが表示されます。
エディタ・ウィンドウで、説明をHelloWorld Exampleに設定します。
クラス名をoracle.apps.ess.howto.HelloWorldJobに設定します。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「ビジネス層」を開き、「エンタープライズ・スケジューラ・メタデータ」→「ジョブ定義」を選択して「OK」をクリックします。
「ジョブ定義の作成」ダイアログで、次を指定します。
名前をHelloWorldJobDefに設定します。
パッケージを/oracle/apps/ess/howto/に設定します。
ジョブ・タイプを/oracle/apps/ess/howto/HelloWorldJobTypeに設定します。
「OK」をクリックします。これにより、HelloWorldJobDef.xmlファイルが作成され、Oracle JDeveloperのエディタでファイルが表示されます。
エディタ・ウィンドウで、説明をHelloWorld Exampleに設定します。
「システム・プロパティ」セクションで「追加」アイコンをクリックします。
「システム・プロパティの追加」ダイアログで、「名前」ドロップダウン・リストから「SYS_effectiveApplication」を選択します。
初期値をEssDemoAppに設定し、「OK」をクリックします。
「アクセス制御」セクションで「追加」アイコンをクリックします。
「アクセス制御の追加」ダイアログで、「ロール」ドロップダウン・リストのEssDemoAppロールが選択されていることを確認します。
これは、第5.9.1.2項「バックエンドのホスティング・アプリケーションのセキュリティの構成」で作成したロールです。
「読取り」を選択し、「実行」を選択します。
「OK」をクリックします。
バックエンドのサンプル・アプリケーションを作成した後、Oracle JDeveloperを使用してアプリケーションをアセンブルします。
バックエンドのアプリケーションをアセンブルするには、次を実行します:
EJB Javaアーカイブの作成
アプリケーションMARおよびEARファイルの作成
EJB Javaアーカイブ・ファイルには、Javaジョブ実装のディスクリプタが含まれています。
バックエンドのホスティング・アプリケーションのEJB JARファイルをアセンブルする手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「SuperEss.jprの再ビルド」を選択します。
メッセージ・ログに、次のようなコンパイル完了のメッセージが表示されることを確認します。
[3:40:22 PM] Successful compilation: 0 errors, 0 warnings.
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で、「一般」を展開し、「デプロイメント・プロファイル」→「EJB JARファイル」を選択して、「OK」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、「デプロイメント・プロファイル名」をJAR_SuperEssEjbJarに設定します。
必要に応じて、「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログで、「ファイル・グループ」→「プロジェクトの出力」を開き、「フィルタ」を選択して「essmeta」チェック・ボックスの選択を解除します。
このチェック・ボックスの選択を解除すると、JARファイルが不要なXMLファイルでいっぱいになるのを防ぎ、メモリー・フットプリント全体が削減されます。
「EJB JARデプロイメント・プロファイルのプロパティ」ダイアログで、「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
サンプル・アプリケーションには、バックエンドのアプリケーションをアセンブルするMARプロファイルおよびEARファイルが含まれている必要があります。
バックエンドのホスティング・アプリケーションのMARおよびEARファイルを作成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション・メニュー」→「アプリケーションのプロパティ...」を選択します。
「アプリケーションのプロパティ」ダイアログで「デプロイメント」ナビゲーション・タブをクリックし、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「MARファイル」を選択します。
「名前」フィールドにMAR_EssDemoAppMarと入力し、「OK」をクリックします。
「MARデプロイメント・プロファイルの編集」ダイアログのナビゲータで「メタデータ・ファイル・グループ」を開き、「ユーザー・メタデータ」をクリックします。
「追加」をクリックします。
「コントリビュータの追加」ダイアログでessmetaディレクトリを追加します。
たとえば、ワークスペースが/tmp/EssDemoAppにある場合、追加するディレクトリは/tmp/EssDemoApp/SuperEss/essmetaになります。
「コントリビュータの追加」ダイアログで、「OK」をクリックします。
ナビゲータで「メタデータ・ファイル・グループ」および「ユーザー・メタデータ」を順に開いて「ディレクトリ」を選択します。
ディレクトリを開き、パッケージ名の最も深いディレクトリであるhowtoディレクトリを選択します。
選択したディレクトリはMDSネームスペースを形成します。競合を回避するため、非常に明確なネームスペースを選択する必要があります。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログの「デプロイメント」ページで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「EARファイル」を選択します。
「名前」フィールドにEAR_EssDemoAppEarと入力し、「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「アプリケーション名」フィールドにEssDemoAppと入力します。
「アプリケーション・アセンブリ」ナビゲーション・タブをクリックし、MAR_ESSDemoAppMarを選択してJAR_SuperEssEjbJarを選択します。
「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でバックエンドのホスティング・アプリケーションの場合に使用したのと同様の手順を使用します。
フロントエンドの発行者アプリケーションを作成する手順は、次のとおりです。
第5.9.1.1項「バックエンドのホスティング・アプリケーションの作成」の手順を実行しますが、今回はアプリケーションの名前としてESSDemoAppUIを使用します。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を選択し、「フォルダ」を選択して「OK」をクリックします。
フォルダ名をessmetaに設定し、「OK」をクリックします。
非同期JavaジョブでOracle Enterprise Schedulerにそのステータスを通知できるようにし、発行操作などの実行可能な操作やジョブ定義などのOracle Enterprise Schedulerメタデータをユーザーが操作できるようにするには、ejb-jar.xmlファイルにエントリを追加する必要があります。また、使用するストライプも示す必要があります。
フロントエンドの発行者アプリケーションのデプロイメント・ディスクリプタを定義する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で「SuperEss」→「アプリケーション・ソース」→「META-INF」の順に開き、「ejb-jar.xml」をダブルクリックします。
ファイルのコンテンツを、例5-10に示すXMLで置き換えます。
例5-10 フロントエンドの発行者アプリケーションのejb-jar.xmlにコピーするコンテンツ
<?xml version = '1.0' encoding = 'UTF-8'?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<display-name>ESS</display-name>
<enterprise-beans>
<!-- Note that the UI application does NOT have a message driven bean.
- This is because the UI application does not run any jobs. The UI
- application does have the other EJBs.
-->
<!-- The AsyncBean allows asynchronous Java jobs to notify
- Oracle Enterprise Scheduler of its status through Java EE EJB APIs.
- It is recommended to instead use the WebService callback pattern
- instead of the EJB callbacks wherever possible.
-->
<session>
<description>Async Request Bean</description>
<ejb-name>AsyncRequestBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.AsyncRequestBean</ejb-class>
</session>
<!-- The Runtime Service allows users to interact with an Executable.
- Operations include submitting, cancelling, querying, etc.
-->
<session>
<description>Runtime Session Bean</description>
<ejb-name>RuntimeServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.RuntimeServiceBean</ejb-class>
</session>
<!-- The Metadata Service allows users to interact with
- Oracle Enterprise Scheduler, metadata, including job definitions,
- job sets, job types, schedules, and so on.
- Operations include reading, writing, querying, copying, deleting,
- and so on.
-->
<session>
<description>Metadata Session Bean</description>
<ejb-name>MetadataServiceBean</ejb-name>
<ejb-class>oracle.as.scheduler.ejb.MetadataServiceBean</ejb-class>
</session>
</enterprise-beans>
<!--
- The JPS interceptor is used by JPS (Java Platform Security) in order to
- perform security checks. The "stripe name" is usually associated with
- the application name but some groups split their security permissions
- between Oracle ADF grants and Oracle Enterprise Scheduler grants, thereby
- creating two stripes. For example, the Oracle ADF grants would live
- in the "MyApp" stripe while the Oracle Enterprise Scheduler
- grants would live in the "MyAppEss".
-
- Note: For this example, we will use only 1 stripe.
-
- Note: When creating jps-config.xml through JDev, it will create
- default security context using the JDev workspace name. In
- order to simplify things, we will use the JDev workspace name
- as our value. Otherwise, you will have to rename the security
- context created by JDev or create your own.
-->
<interceptors>
<interceptor>
<interceptor-class>oracle.security.jps.ee.ejb.JpsInterceptor</interceptor-class>
<env-entry>
<env-entry-name>application.name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>EssDemoApp</env-entry-value>
<injection-target>
<injection-target-class>oracle.security.jps.ee.ejb.JpsInterceptor</injection-target-class>
<injection-target-name>application_name</injection-target-name>
</injection-target>
</env-entry>
</interceptor>
</interceptors>
</ejb-jar>
サーブレットのWebプロジェクトを作成する必要があります。
SuperWebプロジェクトを作成する手順は、次のとおりです。
SuperEssプロジェクトを右クリックし、「新規」をクリックします。
「新規ギャラリ」で「一般」を開き、「プロジェクト」→「汎用プロジェクト」を選択して、「OK」をクリックします。
汎用アプリケーションの作成ウィザードの「アプリケーションの名前付け」ページで、「アプリケーション名」フィールドをSuperWebに設定します。
「プロジェクトの名前付け」ページで、「プロジェクト名」をSuperEssに設定します。
プロジェクトに「JSPおよびサーブレット」テクノロジを追加します。
「プロジェクトJava設定」ページで、デフォルト・パッケージをoracle.apss.ess.howtoに変更し、「終了」をクリックします。
「アプリケーション・ナビゲータ」で、SuperWebプロジェクトを右クリックし、「プロジェクト・プロパティ」を選択します。
「ライブラリとクラスパス」ナビゲーション・タブを選択します。
「ライブラリの追加」をクリックし、「ADF Webランタイム」およびエンタープライズ・スケジューラ拡張機能を選択して「OK」をクリックします。
アプリケーションのセキュリティを構成する必要があります。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のコンテンツを例5-11に示すコードで置き換えます。
例5-11 フロントエンドの発行者アプリケーションの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参照」セクションを開きます。
表5-1に示す情報を含む2つのEJBリソースを追加します。
「サーブレット」ナビゲーション・タブをクリックし、「サーブレット・マッピング」タブをクリックします。
/essdemoappservlet URLパターンを/essdemoappservlet/*に変更します。
weblogic-application.xmlファイルを作成し、編集する必要があります。
フロントエンドの発行者アプリケーションのweblogic-application.xmlファイルを編集する手順は、次のとおりです。
「アプリケーション・ナビゲータ」で、SuperEssプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で「一般」を開き、「デプロイメント・ディスクリプタ」→「Weblogicデプロイメント・ディスクリプタ」を選択し、「OK」をクリックします。
「ディスクリプタの選択」ページでweblogic-application.xmlを選択します。
「次へ>」をクリックし、再度「次へ>」をクリックして「終了」をクリックします。
ソース・エディタで、作成したweblogic-application.xmlファイルのコンテンツを例5-12に示すXMLで置き換えます。
例5-12 フロントエンドの発行者アプリケーションの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ファイルのコンテンツを例5-13に示すXMLで置き換えます。
例5-13 フロントエンドの発行者アプリケーションの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」をクリックします。
サンプル・アプリケーションには、バックエンドのアプリケーションをアセンブルするMARプロファイルおよびEARファイルが含まれている必要があります。
フロントエンドの発行者アプリケーションのMARおよびEARファイルを作成する手順は、次のとおりです。
メイン・メニューから、「アプリケーション・メニュー」→「アプリケーションのプロパティ...」を選択します。
「アプリケーションのプロパティ」ダイアログで「デプロイメント」ナビゲーション・タブをクリックし、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「MARファイル」を選択します。
「名前」フィールドにMAR_EssDemoAppUIMarと入力し、「OK」をクリックします。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログの「デプロイメント」ページで、「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで「アーカイブ・タイプ」ドロップダウン・リストから「EARファイル」を選択します。
「名前」フィールドにEAR_EssDemoAppUIEarと入力し、「OK」をクリックします。
「EARデプロイメント・プロファイルのプロパティの編集」ダイアログで「一般」ナビゲーション・タブをクリックし、「アプリケーション名」フィールドにEssDemoAppUIと入力します。
「アプリケーション・アセンブリ」ナビゲーション・タブをクリックし、MAR_ESSDemoAppUIMarを選択してJAR_SuperEssEjbJarを選択します。
「OK」をクリックします。
「アプリケーションのプロパティ」ダイアログで、「OK」をクリックします。
アプリケーションをアセンブルした後、サーバーにデプロイできます。
バックエンドのホスティング・アプリケーションをデプロイする手順は、次のとおりです。
メイン・メニューから、「アプリケーション」→「デプロイ」→「EAR_EssDemoAppEar...」の順に選択します。
アプリケーションをコンテナに設定し、デプロイします。
「デプロイメント構成」ダイアログで、「共有メタデータ・リポジトリ」パネルに2つのエントリがあります。/oracle/apps/ess/howto namespaceにマップされた共有リポジトリを見つけます。そのパーティションを、EssDemoAppのデプロイ時に使用したパーティションに変更します。デフォルト値を使用した場合、これはEssDemoApp_V2.0になります。
「OK」をクリックします。