ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Enterprise Scheduler開発者ガイド
11g リリース1 (11.1.1.7)
B66615-04
  目次へ移動
目次

前
 
次
 

14 ランタイム・サービスの使用

この章では、Oracle Enterprise Schedulerランタイム・サービスAPIを使用して、ジョブ・リクエストを発行および管理し、ジョブ・リクエスト履歴からジョブ・リクエスト情報を問い合せる方法について説明します。

この章では、次の項目について説明します。

14.1 ランタイム・サービスの概要

Oracle Enterprise Schedulerを使用すると、Javaクラス、PL/SQLプロシージャおよびプロセス・ジョブ・タイプ(分岐プロセス)など、様々なジョブ・タイプを定義して実行できます。これらのジョブ・タイプを実行するには、ジョブ定義を発行する必要があります。

ランタイム・サービスを使用して、次のような様々なタイプの操作を実行できます。

14.2 ランタイム・サービスへのアクセス

メタデータ・サービスと同様に、Oracle Enterprise SchedulerではランタイムMBeanプロキシ・インタフェースを提供します。

ランタイム・サービスのopen()メソッドにより、各Oracle Enterprise Schedulerランタイム・サービス・ユーザー・トランザクションが開始されます。Oracle Enterprise Schedulerアプリケーション・クライアントでは、open()により作成されるRuntimeServiceHandle参照を取得して、その参照をランタイム・サービス・メソッドに渡します。RuntimeServiceHandle参照により、クライアント・アプリケーションにランタイム・サービスへの接続が提供されます。クライアント・アプリケーションでは、close()をコールしてランタイム・サービスを明示的に終了する必要があります。これによりトランザクションが終了し、トランザクションがコミットまたはロールバック(取消し)されます。close()はランタイム・サービス内のトランザクション動作を制御するだけでなく、Oracle Enterprise SchedulerによりRuntimeServiceHandleに関連付けられているリソースを解放できるようにします。

14.2.1 ランタイム・サービスにアクセスしてランタイム・サービス・ハンドルを取得する方法

Oracle Enterprise Schedulerでは、アプリケーション・プログラムに対して、ランタイム・サービスをステートレス・セッションEnterprise Java Bean (EJB)として公開します。Oracle Enterprise Schedulerランタイム・サービスのステートレス・セッションEJBを見つけるために、JNDIを使用できます。

例14-1に、RuntimeServiceLocalHomeオブジェクトを使用したOracle Enterprise Schedulerランタイム・サービスのルックアップを示します。

例14-1 Oracle Enterprise Schedulerランタイム・サービスにアクセスするためのJNDIルックアップ

import oracle.as.scheduler.core.JndiUtil;
// Demonstration of how to lookup runtime service from a
// Java EE application component
    
    RuntimeService runtime = JndiUtil.getRuntimeServiceEJB();
    RuntimeServiceHandle rHandle = null;
    .
    .
    .
    try
    {
         ...
         rHandle = runtime.open();
         ...
    }
    finally
    {
        if (rHandle != null)
        {
            runtime.close(rHandle);
        }
    }

注意:

ランタイム・サービスにアクセスするときは、次のことに注意してください。

  • JndiUtil.getRuntimeServiceEJB()では、RuntimeService EJBがローカルのJNDIロケーション"ess/runtime"にマップされていることを前提としています。これは、ホストされているアプリケーションのメッセージドリブンBean (MDB)内で自動的に行われます。

  • open()コールによって、RuntimeServiceHandle参照が提供されます。この参照は、アプリケーション・プログラム内の、ランタイム・サービスにアクセスするメソッドで使用します。

  • ランタイム・サービスの使用が終了したら、close()をコールして、RuntimeServiceHandleに関連付けられているリソースを解放する必要があります。


14.3 ジョブ・リクエストの発行

ジョブ定義の発行時に、新しいジョブ・リクエストを作成します。メタデータ・リポジトリで維持されているジョブ定義を使用してジョブ・リクエストを発行するか、ジョブ定義またはスケジュールがメタデータ・リポジトリに格納されない非定型方式でジョブ・リクエストを作成できます(非定型リクエストの詳細は、第14.6項「非定型ジョブ・リクエストの発行」を参照してください)。

14.3.1 ランタイム・サービスへのリクエストの発行方法

ジョブ・リクエストを作成するには、submitRequest()をコールします。必要に応じて、次のいずれかの形式でジョブ・リクエストを作成できます。

  • 特定の時間に1回のみ実行する場合は、メタデータ・リポジトリに格納されているジョブ定義を使用して、新しいジョブ・リクエストを作成します。

  • メタデータ・リポジトリに格納されている各ジョブ定義とスケジュールを使用して、新しいジョブ・リクエストを作成します。

例14-2に、メタデータ・リポジトリに常駐するジョブ定義を使用して新しいジョブ・リクエストを作成するsubmitRequest()メソッドを示します。また、ジョブ定義とスケジュールがメタデータ・リポジトリに格納されない、非定型ジョブ・リクエストを発行することもでます。詳細は、第14.6項「非定型ジョブ・リクエストの発行」を参照してください。サブリクエストを発行することもできます。詳細は、第15章「サブリクエストの使用」を参照してください。

例14-2 submitRequest()によるジョブ・リクエストの作成

long requestID = 0L;
MetadataObjectId jobDefnId;
 
RequestParameters p = new RequestParameters();
 
p.add(SystemProperty.CLASS_NAME, "demo.jobs.Job");
 
Calendar start = Calendar.getInstance();
start.add(Calendar.SECOND, startsIn);
 
requestID =
    runtime.submitRequest(r,
        "My Java job",
        jobDefnId,
        start,
        p);

注意:

ランタイム・サービスを使用してジョブ・リクエストを発行するときには、次のことに注意してください。

  • 例14-1に示されているように、ランタイム・サービス・ハンドルを取得します。

  • ランタイム・サービスでは、メタデータ・サービスを内部的に使用して、指定されたMetadataObjectIdjobDefnIdを持つジョブ定義メタデータを取得します。


14.3.2 リクエスト発行時のデフォルト・システム・プロパティに関する注意事項

ジョブ・リクエストを作成するとき、Oracle Enterprise Schedulerによって、ジョブ・リクエストに関連付けられているプロパティが解決および格納されます。このとき、特定のシステム・プロパティがジョブ・リクエストに関連付けられていることが必要になります。ジョブ・リクエストが発行されたとき、これらの必須プロパティをプロパティ階層内に設定していなかった場合は、Oracle Enterprise Schedulerによってデフォルト値が提供されます。

表14-1に、必須のジョブ・リクエスト・プロパティに対するランタイム・サービス・フィールド名と対応するシステム・プロパティを示します。

表14-1 ランタイム・サービスのデフォルト値フィールドと対応するシステム・プロパティ

ランタイム・サービスのデフォルト値フィールド 対応するシステム・プロパティ 説明

0

DEFAULT_REQUEST_EXPIRATION

REQUEST_EXPIRATION

リクエストのデフォルト有効期限(分数)。デフォルト値は0で、リクエストが有効期限切れにならないことを意味します。

4

DEFAULT_PRIORITY

PRIORITY

リクエストに関連付けられているデフォルトのシステム優先度。

5

DEFAULT_REPROCESS_DELAY

REPROCESS_DELAY

Action.DELAYを返すコールアウト・ハンドラにより処理が延期されるデフォルトの時間(分数)。

0

DEFAULT_RETRIES

RETRIES

失敗したリクエストのデフォルトの再試行回数。デフォルト値は0で、失敗したリクエストが再試行されないことを意味します。


14.3.3 リクエスト発行時のメタデータに関する注意事項

ジョブ・リクエストに関連付けられているすべてのOracle Enterprise Schedulerメタデータは、リクエストの発行時にランタイム・ストアに維持されます。維持されるメタデータ・オブジェクトには、ジョブ定義、ジョブ・タイプ、ジョブ・セット、スケジュール、非互換性定義および除外定義があります。メタデータは最上位レベルのリクエストのコンテキストに格納され、各メタデータ・オブジェクトは絶対親リクエストIDおよびそのメタデータIDによって一意に識別されます。最上位レベルのリクエストに対して、一意のメタデータ・オブジェクトはそれぞれ1回のみ格納され、これは、そのリクエスト内で定義が複数回使用されている場合も同様です。これにより、すべての子リクエストで必ず同じ定義が使用されます。

リクエストが発行されると、リクエストのすべての既知のメタデータが維持されます。サブリクエストの場合は、サブリクエストが発行されるまでメタデータが認識されないため、サブリクエスト・メタデータは、サブリクエストの発行時に、メタデータ・オブジェクトがすでにランタイム・ストアにおいて永続化されていないことが確認された後で、維持されます。

ランタイム・ストアに維持されたメタデータは、絶対親リクエストが削除されるときに削除されます。

14.4 ジョブ・リクエストの管理

ジョブ・リクエストを発行した後、requestIDを使用して、次のことを実行できます:

14.4.1 getRequestDetailによるジョブ・リクエスト情報の取得方法

ランタイム・サービスをrequestIDとともに使用して、システム内に存在するジョブ・リクエストの情報を取得できます。表14-2に、ジョブ・リクエスト情報を取得できるようにするランタイム・サービス・メソッドを示します。

表14-2 ランタイム・サービスのGetリクエスト・メソッド

ランタイム・サービス・メソッド 説明

getRequestDetail()

指定したリクエストの完全なランタイム詳細を取得します。

getRequestDetailBasic()

指定したリクエストの基本的なランタイム詳細を取得します。このメソッドによって返されるRequestDetailには、ほとんどの情報がgetRequestDetail()として含まれますが、使用頻度の低い特定の情報はパフォーマンスを向上させるために省略されます。

getRequestParameter()

リクエスト・パラメータの値を取得します。

getRequests()

指定したリクエストに関連付けられている直接的な子リクエスト識別子の列挙を取得します。これには、完了していないリクエストのIDが含まれます(リクエスト・トランザクションがロールバックされる場合や、エラーが発生した場合など)。

getRequestState()

指定したリクエストの現在の状態を取得します。


例14-3に、HOLD状態にある直接的な子リクエストがあるかどうかを判別するコードを示します。

例14-3 直接的な子のジョブ・リクエストが保留中であるかどうかの判別

        h = s_runtime.open();
        try {
 
            s_runtime.holdRequest(h,reqid);
 
            Enumeration  e = s_runtime.getRequests(h, reqid);
 
            boolean foundHold = false;
            while (e.hasMoreElements()) {
 
                long childid = ((Long)e.nextElement()).longValue();
                State state = s_runtime.getRequestState(h,childid);
                if (state == State.HOLD) {
                    foundHold = true;
                    break;
                }
            }

14.4.2 ジョブ・リクエスト状態の変更方法

ランタイム・サービスをrequestIDとともに使用して、ジョブ・リクエストの状態を変更できます。表14-3に、ランタイム・サービスのジョブ・リクエスト状態変更メソッドを示します。ジョブ・リクエスト管理メソッドを使用すると、ジョブ・リクエストの状態によっては、リクエストの状態を変更できます。たとえば、リクエストがCOMPLETED状態である場合は、cancelRequest()でリクエストを取り消すことはできません。

表14-3 ランタイム・サービスのジョブ・リクエスト状態メソッド

ランタイム・サービス・メソッド 説明

cancelRequest()

終了状態にないリクエストの処理を取り消します。

deleteRequest()

終了状態にあるリクエストを削除対象としてマークします。

holdRequest()

WAITまたはREADY状態にあるリクエストのそれ以降の処理を保留にします。

releaseRequest()

リクエストのHOLD状態を解除します。


例14-4に、submitRequest()とジョブ・リクエストの状態を制御するメソッドを示します。holdRequest()は、ジョブ・リクエストの処理を保留にします。対応するreleaseRequest()によって、リクエストが解放されます。この例では、リクエストを保留にする必要がある条件は示しません。

例14-4 ランタイム・サービスのreleaseRequest()の使用

rHandle = s_runtime.open();
try {
            s_runtime.holdRequest(rHandle,reqid);
            Enumeration  e = s_runtime.getRequests(rHandle, reqid);
            while (e.hasMoreElements()) {
 
                long childid = ((Long)e.nextElement()).longValue();
                State state = s_runtime.getRequestState(rHandle,childid);
                if (state == State.HOLD) {
                    foundHold = true;
                    break;
                }
            }
.
.
.
            s_runtime.releaseRequest(rHandle, reqid);
.
.
.

注意:

例14-4について、次のことに注意してください。

  • 例14-1に示されているように、ランタイム・サービス・ハンドルrHandleを取得します。

  • holdRequest()によって、リクエストがHOLD状態になります。

  • リクエストがHOLD状態にある間も、必要な一部の処理を実行できます。

  • releaseRequest()によって、リクエストのHOLD状態が解除されます。


14.4.3 ジョブ・リクエストの優先度とジョブ・リクエスト・パラメータの更新方法

ランタイム・サービスを使用して、ジョブ・リクエストのシステム・プロパティまたはリクエスト・パラメータを更新できます。表14-4に、ジョブ・リクエストをロックおよび更新できるようにするランタイム・サービス・メソッドを示します。

表14-4 ランタイム・サービスの更新メソッド

ランタイム・サービス・メソッド 説明

lockRequest()

指定されたリクエストのロックを取得します。ロックは、close()操作がその後で起動されるか、またはそのロックを包含するトランザクションがコミットされると解放されます。他のスレッドによってロックが保持されているときに、アプリケーションがこの操作の起動を試みると、このメソッドはロックが解放されるまでブロックされます。このメソッドは、リクエスト・パラメータまたはシステム・プロパティを更新する際に、データの一貫性を確保するために使用します。

updateRequestParameter()

指定されたリクエスト・サブジェクトのプロパティ値を、プロパティの読取り専用制約に更新します。


例14-5に、ジョブ・リクエスト・パラメータを更新するコードを示します。例14-1に示されているように、このコードはtry/finallyブロック内に含められます。

例14-5 ランタイム・サービス・パラメータの更新のサンプル

...
  s_runtime.lockRequest(rhandle, reqid);
  s_runtime.updateRequestParameter(rhandle, reqId, paramName, "yy");
...

例14-5は、次のことを示しています。

  • 例14-1に示されているように、ランタイム・サービス・ハンドルrhandleを取得します。

  • lockRequest()を使用して、いずれかのリクエストにロックを取得します。

  • updateRequestParameter()により更新操作を実行します。

  • close()を使用して、トランザクションをコミットまたはロールバック(取消し)します。close()はランタイム・サービス内のトランザクション動作を制御するだけでなく、Oracle Enterprise SchedulerによりRuntimeServiceHandleに関連付けられているリソースを解放できるようにします。

14.5 ジョブ・リクエストの問合せ

ランタイム・サービスを使用して、ジョブ・リクエスト情報を問い合せることができます。これを行うには次の手順が必要になります。

問合せメソッドは、ランタイム・サービスのqueryRequests()メソッドの1つのみです。このメソッドにより、問合せに一致するリクエストIDの列挙が返されます。queryRequests()メソッドには、問合せ結果の選択に役立つフィールド、コンパレータおよび値の組合せが格納されたフィルタ引数が含まれます。戻り値には、完了していないリクエストのIDが含まれます(リクエスト・トランザクションがロールバックされる場合や、エラーが発生した場合など)。フィルタの詳細は、第6.4.1項「フィルタの作成方法」を参照してください。

問合せにフィルタを作成すると、ランタイム・ストアを問い合せるときに、表14-5に示されているいずれかのフィールド名を使用できます。

表14-5 ランタイムの問合せ用の問合せフィルタ・フィールド(列挙RuntimeService.QueryFieldで定義)

名前 説明

ABSPARENTID

リクエストの絶対親リクエストID。

APPLICATION

アプリケーション名。

ASYNCHRONOUS

ジョブが非同期、同期または不明のいずれであるかを示します。フィールドの値は、リクエストが処理されるまで設定されません。フィールドのデータ型はjava.lang.Booleanです。ジョブの性質がまだ決定されていない場合、この値はNULLにできます。

CLASSNAME

リクエストを処理した実行可能クラスの名前。

COMPLETED_TIME

Oracle Enterprise Schedulerでリクエストの処理が終了した日時。このフィールドは、プロセス・フェーズがCOMPLETEDに設定された時間を表します。

DEFINITION

ジョブ定義ID(メタデータ・オブジェクトID)。

ELAPSEDTIME

リクエストの実行に要した時間(ミリ秒)。

ENTERPRISE_ID

エンタープライズID。

ERROR_TYPE

リクエスト・エラー・タイプ。

EXTERNAL_ID

Oracle Enterprise Scheduler非同期Javaジョブの外部部分の識別子。

INSTANCEPARENTID

インスタンスの親リクエストのリクエストID。

JOB_TYPE

ジョブ・タイプID(メタデータ・オブジェクトID)。

NAME

リクエストの説明。

PARENTREQUESTID

親リクエストID。

PRIORITY

リクエストの優先度。

PROCESS_PHASE

リクエストのプロセス・フェーズ。

PROCESSEND

プロセスが終了した日時。PROCESSSTARTは、リクエストがREADYからRUNNINGに遷移した場合にのみ設定されます。これは、(PROCESSEND - PROCESSSTART)に、状態がRUNNINGになってから終了状態に遷移するまでの、実行の全期間が含まれることを意味します。

PROCESSOR

リクエストを処理したインスタンスの名前。

PROCESSSTART

プロセスが開始した日時。PROCESSSTARTは、リクエストがREADYからRUNNINGに遷移した場合にのみ設定されます。これは、(PROCESSEND - PROCESSSTART)に、状態がRUNNINGになってから終了状態に遷移するまでの、実行の全期間が含まれることを意味します。

PRODUCT

製品名。

READYWAIT_TIME

リクエストがREADYになった後、実行を待機している時間(ミリ秒)。

REQUEST_CATEGORY

リクエストに指定されたリクエスト・カテゴリ。

REQUESTEDEND

リクエストされた終了時間。

REQUESTEDSTART

リクエストされた開始時間。

REQUESTID

発行されたリクエストのリクエストID。

REQUESTTYPE

リクエストのタイプ(つまり、RequestTypeの要素)。

RESULTINDEX

返された結果の開始および終了索引を制御します。ユーザーはこのフィールドを使用して、「10から20までの結果のみを返す」などの結果の制約を示すことができます。

RETRIED_COUNT

ジョブに関連付けられている再試行回数。このフィールドは、ジョブが再試行された回数を表します。

SCHEDULE

スケジュールID(メタデータ・オブジェクトID)。

SCHEDULED

スケジュールされたリクエストの実行時間。

STATE

ジョブ・リクエストの状態。

SUBMISSION

リクエストの発行時間。

SUBMITTER

リクエストの発行者。

SUBMITTERGUID

リクエストの発行者GUID。

TIMED_OUT

ジョブがタイムアウトしたかどうかを示します。

TYPE

リクエストの実行タイプ。

USERNAME

リクエストを発行したユーザーの名前。

WAITTIME

リクエストが実行を待機している時間(ミリ秒)。

WORKASSIGNMENT

リクエストが処理されたときにアクティブだった作業割当ての名前。


表14-6にジョブ・リクエストを問い合せるランタイム・サービス・メソッドを、例14-6にこのメソッドの使用方法を示します。

表14-6 ランタイム・サービスの問合せメソッド

ランタイム問合せメソッド 説明

queryRequests()

リクエストのサマリーを取得します。


例14-6 queryRequest()メソッドの使用

           Filter filter =
                new Filter(RuntimeService.QueryField.DEFINITION.fieldName(),
                           Filter.Comparator.EQUALS,
                           m_myJavaSucJobDef.toString())
                .and(RuntimeService.QueryField.STATE.fieldName(),
                     Filter.Comparator.EQUALS,
                     new Integer(12) );
 
            // 
            Enumeration requests =
                s_runtime.queryRequests(h,
                                        filter,
                                        RuntimeService.QueryField.REQUESTID,
                                        false);

14.6 非定型ジョブ・リクエストの発行

非定型リクエストを使用するには、リクエスト・パラメータ、ジョブ定義、およびオプションで、メタデータ・リポジトリに保存せずに作成および定義するスケジュールを指定します。非定型リクエストでは、メタデータ・リポジトリでジョブ・リクエストの詳細を定義する必要がありません。このため、非定型リクエストによって、メタデータ・リポジトリへの接続を使用しないで実行できる、省略されたジョブ・リクエスト発行プロセスがサポートされます。


注意:

非定型リクエストには、ジョブ・セットはサポートされないという制約があります。


14.6.1 非定型リクエストの作成方法

非定型リクエストを作成するには、非定型バージョンのsubmitRequest()を使用します。ジョブ定義の場合は、ジョブ定義MetadataObjectIdを指定するかわりに、表14-7で示されているように、ジョブ定義オブジェクトを定義して、ジョブ・タイプに対応するシステム・プロパティを使用できます。

表14-7 ジョブ・タイプに対する非定型リクエスト・ジョブ定義のシステム・プロパティ

システム・プロパティ 説明

CLASS_NAME

実行するJavaクラスを指定します(Javaジョブ・タイプに対して)。

PROCEDURE_NAME

実行するPL/SQLストアド・プロシージャを指定します(SQLジョブ・タイプに対して)。

CMDLINE

プロセス・ジョブ・リクエストに対して外部プログラムを起動するために使用されるコマンドラインを指定します。


非定型バージョンのsubmitRequest()の1つのシグネチャを使用すると、MetadataObjectIdsを指定する必要はありません。Scheduleオブジェクトを、オブジェクト・インスタンスを表す引数として、直接submitRequest()に指定できます。その他の非定型submitRequest()シグネチャを使用すると、メタデータのジョブ定義およびScheduleオブジェクトのインスタンスを使用して、ジョブ・リクエストを発行できます。

例14-7に、スケジュールを使用する非定型リクエスト発行のサンプル・コードを示します。

例14-7 非定型リクエストのリクエスト・パラメータとスケジュールの作成

            RequestParameters p = new RequestParameters();
            String propName = "testProp";
            String propValue = "testValue";
            p.add(propName, propValue);
            p.add(SystemProperty.REQUEST_EXPIRATION, new Integer(10));
            p.add(SystemProperty.LISTENER, "test.listener.TestListener");
            p.add(SystemProperty.EXECUTE_PAST, "TRUE");
            p.add("application", getApplication());
            p.add(SystemProperty.CLASS_NAME, "test.job.HelloWorld");
 
            Calendar start = Calendar.getInstance();
            start.add(Calendar.SECOND, 5);
            Calendar end = (Calendar) start.clone();
            end.add(Calendar.SECOND, 5);
 
            Recurrence recur = new Recurrence(RecurrenceFields.FREQUENCY.SECONDLY,
                                              2,
                                              start,
                                              end);
 
            Schedule schedule = new Schedule("mySchedule",
                                     "Run every 2 sec for 3 times.",
                                      recur);
 
            // adhoc submission, no metadata definitions passed
            reqId = s_runtime.submitRequest(h,
                                    "testAdhocJavaWithSchedule",
                                    JobType.ExecutionType.JAVA_TYPE,
                                    schedule,
                                    null,
                                    Calendar.getInstance(),
                                    null,
                                    p);

この例では、リクエスト発行に関する次の非定型固有の詳細に注意してください。

  • CLASS名は、Oracle Enterprise Schedulerによるジョブ・リクエストの実行時に、実行されるJavaクラスを定義するために次のように設定されます。p.add(SystemProperty.CLASS_NAME, "test.job.HelloWorld");

  • submitRequest()には、ジョブ・タイプを指定する次の引数が含まれます。JobType.ExecutionType.JAVA_TYPE

  • 表14-7に示されているいずれかのシステム・プロパティを設定することによって、非定型リクエストが処理されるときに実行するJavaクラス、プロシージャ名またはコマンドライン・プログラムを指定します。

  • 非定型バージョンのsubmitRequest()をコールして、リクエストを定義するために設定するシステム・プロパティに対応するタイプ引数を指定します。指定するタイプは、JAVA_TYPESQL_TYPEまたはPROCESS_TYPEのいずれかである必要があります。

  • 他のすべてのジョブ・リクエストと同様に、ジョブ・リクエストに関連付ける適切なシステム・プロパティを設定します。

14.6.2 非定型リクエストの作成時の処理内容

非定型のsubmitRequest()では、リクエストに対してリクエスト識別子が返されます。他のすべてのジョブ・リクエストと同様に、このリクエスト識別子をupdateRequestParameter()getRequestDetail()などのランタイム・コールとともに使用できます。

非定型ジョブ定義を使用してリクエストを作成するsubmitRequestシグネチャは1つのみ存在します。この場合、RequestDetail.getJobDefn()から取得されるジョブ定義IDはNULLです。非定型ジョブ定義がない場合、リクエストは非定型とはみなされません。

14.6.3 非定型リクエストに関する必知事項

非定型リクエストで使用するスケジュールを定義し、除外日を指定するには、スケジュールに対してaddExclusionDate()メソッドを使用して日付を除外する必要があります。非定型リクエストでは、スケジュールに対してaddExclusion()メソッドを使用して除外日を指定するスケジュールは使用できません。

現在、スケジュールが非定型の場合、ExclusionDefinitionのチェックはスキップされます。このため、スケジュールを使用し、addExclusion()を使用して非定型ジョブ・リクエストを発行する場合は、ジョブ・リクエストに対してExclusionsDefinition IDが使用されません。

14.7 前処理および後処理ハンドラの実装

ジョブのコア・ロジックとともに、ジョブの主要実行コードの前後で実行されるコードを含めることができます。前処理ハンドラと呼ばれる、前に実行されるコードを使用して、ジョブ実行可能ファイルに特定の条件を設定するなどの操作を実行できます。後処理ハンドラと呼ばれる、後で実行されるコードを使用すると、レポートの印刷や通知の送信などによる、ジョブ実行可能ファイルの結果の処理といった操作を実行できます。

特定のインタフェースを実装し、使用するクラスを示すシステム・プロパティを通じてサービスに実装を接続することによって、前処理および後処理ハンドラを提供します。

14.7.1 前処理ハンドラの実装

前処理ハンドラを使用すると、コードでジョブの実行環境を作成するための操作を実行できます。これには、ジョブで必要なリソースへの接続の作成などが含まれます。

プリプロセッサは、リクエストがRUNNING状態に遷移した場合に、リクエストの実行開始時にインスタンス化および起動されます。これはリクエストが実行されるたびに行われ、失敗したリクエストが再試行されたり、一時停止されたリクエストがそのサブリクエストの完了後に再開される場合にも行われます。

前処理ハンドラは、oracle.as.scheduler.PreProcessHandlerインタフェースを実装することにより作成します。前処理ハンドラ・クラスを用意して、SYS_preProcessシステム・プロパティをハンドラ・クラスの完全修飾名に設定することにより、これを使用する必要があることを指定します。ジョブ・メタデータでプロパティを定義するか、リクエスト発行パラメータにプロパティを含めることができます。

14.7.1.1 PreProcessHandlerインタフェースの実装

PreProcessHandler実装では、ジョブで必要な前処理アクションを実行してから、インタフェースの1つのメソッドであるpreProcessからoracle.as.scheduler.HandlerActionインスタンスを返す必要があります。(ジョブで取消しがサポートされるようにするために、クラスでCancellableインタフェースを実装することもできます。これには、空のコンストラクタも提供する必要があります。)

preProcess実装により返されるHandlerActionインスタンスでは、ジョブを続行する必要があるかどうか、および続行する条件に関するステータスを示す必要があります。HandlerActionクラスを構築する場合、リクエストに対する前処理のステータスを示すHandlerStatusインスタンスにこのクラスを渡します。

サポートされているHandlerStatus値とアクションを次のリストに示します。サポートされていないステータスの場合は、リクエストがエラー状態に遷移し、再試行の対象となります(構成されている場合)。

  • PROCEEDは、リクエスト処理を開始する必要があることをOracle Enterprise Schedulerに通知します。リクエストはRUNNING状態のままです。

  • WARNは、リクエスト処理を開始する必要があるが、警告をログに記録する必要があることをOracle Enterprise Schedulerに通知します。リクエストはRUNNING状態のままです。

  • CANCELは、リクエストの前処理が取り消されたことをOracle Enterprise Schedulerに通知します。リクエストはCANCELLED状態に遷移します。

  • DELAYは、SYS_reprocessDelayシステム・プロパティで指定された時間、リクエスト処理を延期するようOracle Enterprise Schedulerに通知します。リクエストは遅延中、RUNNING状態のままとなります。

  • SYSTEM_ERRORは、ハンドラでエラーが発生したことをOracle Enterprise Schedulerに通知します。リクエストはエラー状態に遷移し、再試行の対象となります(構成されている場合)。

  • BIZ_ERRORは、ハンドラでビジネス・エラーが発生したことをOracle Enterprise Schedulerに通知します。リクエストはエラー状態に遷移し、再試行の対象にはなりません。

14.7.2 後処理ハンドラの実装

後処理ハンドラを使用すると、コードでジョブの実行後に行う必要がある操作を実行できます。これには、ジョブによって要求されたリソースへの接続の解放や、リクエスト固有のデータまたはステータスに基づくレポートの生成などが含まれます。

リクエストがCOMPLETED状態に遷移した場合、ポストプロセッサはジョブの実行後にインスタンス化および起動されます。プリプロセッサとは異なり、ポストプロセッサはリクエストに対して1回のみ起動されます。

後処理ハンドラは、oracle.as.scheduler.PostProcessHandlerインタフェースを実装することにより作成します。後処理ハンドラ・クラスを用意して、SYS_postProcessシステム・プロパティをハンドラ・クラスの完全修飾名に設定することにより、これを使用する必要があることを指定します。ジョブ・メタデータでプロパティを定義するか、リクエスト発行パラメータにプロパティを含めることができます。

14.7.2.1 PostProcessHandlerインタフェースの実装

PostProcessHandler実装では、ジョブで必要な後処理アクションを実行してから、インタフェースの1つのメソッドであるpostProcessからoracle.as.scheduler.HandlerActionインスタンスを返す必要があります。(ジョブで取消しがサポートされるようにするために、クラスでCancellableインタフェースを実装することもできます。これには、空のコンストラクタも提供する必要があります。)

postProcess実装により返されるHandlerActionインスタンスでは、ジョブを終了する必要があるかどうかおよび終了する条件に関するステータスを示す必要があります。HandlerActionクラスを構築する場合、リクエストに対する後処理のステータスを示すHandlerStatusインスタンスにこのクラスを渡します。

サポートされているHandlerStatus値とアクションを次のリストに示します。サポートされていないステータスの場合は、リクエストがWARNING状態に遷移します。

  • PROCEEDは、リクエストの後処理が正常に完了したことをOracle Enterprise Schedulerに通知します。ポストプロセッサを起動する直前のリクエストのステータスに応じて、リクエストがSUCCEEDED状態またはWARNING状態に遷移します。

  • WARNは、リクエストの後処理により警告が生成されたことをOracle Enterprise Schedulerに通知します。リクエストはWARNING状態に遷移します。

  • CANCELは、リクエストの後処理が取り消されたことをOracle Enterprise Schedulerに通知します。リクエストはWARNING状態に遷移します。

  • DELAYは、SYS_reprocessDelayシステム・プロパティで指定された時間、リクエスト処理を延期するようOracle Enterprise Schedulerに通知します。リクエストは遅延中、COMPLETED状態のままとなります。

  • SYSTEM_ERRORは、ハンドラでエラーが発生したことをOracle Enterprise Schedulerに通知します。リクエストはWARNING状態に遷移します。

  • BIZ_ERRORは、ハンドラでビジネス・エラーが発生したことをOracle Enterprise Schedulerに通知します。リクエストはWARNING状態に遷移します。