14 プロセス・ジョブの作成と使用

この章では、Oracle Enterprise Schedulerを使用して、スクリプトまたはバイナリ・コマンドを分岐プロセスで実行するプロセス・ジョブを作成する方法について説明します。

この章の内容は次のとおりです。

ランタイム・サービスの使用方法の詳細は、「ランタイム・サービスの使用」を参照してください。

14.1 プロセス・ジョブ定義の作成の概要

Oracle Enterprise Schedulerを使用すると、Javaクラス、PL/SQLストアド・プロシージャ、生成されたジョブとして実行されるプロセス・ジョブなど、様々なタイプのジョブ・リクエストを実行できます。

Oracle Enterprise Schedulerを使用してプロセス・タイプのジョブを実行するには、特定のメタデータを指定して、実行するプロセス・タイプのジョブの特性を定義する必要があります。また、実行時間のスケジュールなどの、ジョブ・リクエストのプロパティを指定する場合もあります。

Oracle Enterprise Schedulerを使用してプロセス・タイプのジョブ・リクエストを指定するには、次の3つのステップ・プロセスを実行します。

  1. Oracle Enterprise Schedulerを使用して実行するスクリプトまたはバイナリ・コマンドを、作成または取得します。生成されたプロセスのためのスクリプトまたはコマンドは以前に作成済であると想定しているため、このステップについては説明しません。

  2. Oracle Enterprise Scheduler APIをアプリケーションで使用して、ジョブ・タイプとジョブ定義のオブジェクトを作成し、これらのオブジェクトをメタデータ・リポジトリに格納します。

  3. Oracle Enterprise Scheduler APIを使用して、ジョブ・リクエストを発行します。リクエストの発行方法の詳細は、「ランタイム・サービスの使用」を参照してください。

Oracle Enterprise Scheduler APIを使用したアプリケーションを作成した後、このアプリケーションをパッケージ化してデプロイする必要があります。

実行時に、ジョブ・リクエストを発行した後、ジョブ・リクエストをモニターおよび管理できるようになります。ジョブ・リクエストの監視および管理の詳細は、「ランタイム・サービスの使用」を参照してください。

14.2 プロセス・ジョブ・タイプのジョブ定義の作成および格納

Oracle Enterprise Schedulerでプロセス・タイプのジョブを使用するには、メタデータ・サービスを特定してジョブ定義を作成する必要があります。

ジョブ定義は、名前とジョブ・タイプを指定して作成します。ジョブ定義を作成するときには、特定のシステム・プロパティも設定する必要があります。ジョブ定義は、メタデータ・サービスを使用してメタデータ・リポジトリに格納できます。

メタデータ・サービスの使用方法の詳細は、「メタデータ・サービスの使用」を参照してください。

14.2.1 プロセス・ジョブ・タイプを作成および格納する方法

Oracle Enterprise SchedulerのJobTypeオブジェクトでは、実行タイプを指定し、ジョブ・リクエストの共通プロパティ・セットを定義します。1つのジョブ・タイプを定義して、1つ以上のジョブ定義で共有できます。Oracle Enterprise Schedulerでは、次の3つの実行タイプがサポートされています。

  • JAVA_TYPE: Javaで実装され、コンテナ内で実行されるジョブ定義に使用します。

  • SQL_TYPE: データベース・サーバーでPL/SQLストアド・プロシージャとして実行されるジョブ定義に使用します。

  • PROCESS_TYPE: ホスト・オペレーティング・システムの制御下で個別のプロセスとして実行される、バイナリおよびスクリプトのジョブ定義に使用します。

JobTypeを指定する場合、JobTypeに関連付けられる特性を定義するSystemPropertiesを指定することもできます。表14-1に、リクエストによってプロセス・ジョブ・タイプに対するプロセスが生成された場合の、リクエストの処理方法を指定するプロパティを示します。

表14-1 プロセス・タイプのジョブのためのシステム・プロパティ

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

BIZ_ERROR_EXIT_CODE

実行ビジネス・エラーを示すプロセス・ジョブ・リクエストのプロセス終了コードを指定します。このプロパティが指定されていない場合、プロセス終了コード4は実行ビジネス・エラーとして処理されます。

CMDLINE

外部プログラムを起動するために必要なコマンド行。

ENVIRONMENT_VARIABLES

生成されたプロセスに対して設定される環境編集を表す名前/値ペア(name=value)のカンマ区切りリスト。

REDIRECTED_OUTPUT_FILE

プロセス・ジョブ・リクエストに対して標準出力およびエラー・ストリームがリダイレクトされるファイルを指定します。

REQUESTED_PROCESSOR

生成されたジョブが実行されるOracle WebLogic Serverノード。

SUCCESS_EXIT_CODE

プロセス・ジョブ・リクエストの正常実行を示すプロセス終了コード。このプロパティが指定されていない場合、プロセス終了コード0は正常完了として処理されます。

WARNING_EXIT_CODE

生成されたジョブの正常実行を示すプロセス終了コード。このプロパティが指定されていない場合、プロセス終了コード3は警告終了として処理されます。

WORK_DIR_ROOT

生成されたプロセスの作業ディレクトリ。

システム・プロパティの詳細は、「パラメータとシステム・プロパティの使用」を参照してください。

例14-1に、PROCESS_TYPEを使用したジョブ定義のサンプルを示します。

例14-1に示すように、プロセス・ジョブ・タイプを作成して格納する場合は、次を実行します。

  • JobTypeコンストラクタを使用して、String名とJobType.ExecutionType.PROCESS_TYPE引数を指定します。

  • 「メタデータ・サービスへのアクセス」に示されているように、メタデータ・ポインタを取得します。メタデータ・サービスのaddJobType()メソッドを使用して、JobTypeをメタデータに格納します。

  • addJobType()によって返されるMedatdataObjectIdでは、一意の識別子を使用して、メタデータ・リポジトリ内のメタデータ・オブジェクトを一意に識別します。

例14-1 Oracle Enterprise Schedulerジョブ定義の作成およびジョブ定義プロパティの設定

import oracle.as.scheduler.ConcurrentUpdateException;
import oracle.as.scheduler.JobType;
import oracle.as.scheduler.JobDefinition;
import oracle.as.scheduler.MetadataService;
import oracle.as.scheduler.MetadataServiceHandle;
import oracle.as.scheduler.MetadataObjectId;
import oracle.as.scheduler.MetadataServiceException;
import oracle.as.scheduler.ParameterInfo;
import oracle.as.scheduler.ParameterInfo.DataType;
import oracle.as.scheduler.ParameterList;
import oracle.as.scheduler.SystemProperty;
import oracle.as.scheduler.ValidationException;

    void createDefinition( )
        throws MetadataServiceException,ConcurrentUpdateException,
               ValidationException
    {
        MetadataService metadata = ...
        MetadataServiceHandle mshandle = null;
       
        try
        {
            ParameterInfo pinfo;
            ParameterList plist;
           
            mshandle = metadata.open();
           
            // Define and add a PL/SQL job type for the application metadata.
            String jobTypeName = "ProcessJobDefType";
            JobType jobType = null;
            MetadataObjectId jobTypeId = null;
           
            jobType = new JobType(jobTypeName, JobType.ExecutionType.
                                  PROCESS_TYPE);
           
            plist = new ParameterList();
            pinfo = SystemProperty.getSysPropInfo(SystemProperty.CMDLINE);
            plist.add(pinfo.getName(), pinfo.getDataType(), "/bin/myprogram 
                      arg1 arg2", false);
            pinfo = SystemProperty.getSysPropInfo(SystemProperty.
                                                  ENVIRONMENT_VARIABLES);
            plist.add(pinfo.getName(), pinfo.getDataType(), 
                                       "LD_LIBRARY_PATH=/usr/lib", false);
            pinfo = SystemProperty.getSysPropInfo(SystemProperty.PRODUCT);
            plist.add(pinfo.getName(), pinfo.getDataType(), "HOW_TO_PROD", false);
            jobType.setParameters(plist);
           
            jobTypeId = metadata.addJobType(mshandle, jobType, "HOW_TO_PROD");
           
            // Define and add a job definition for the application metadata.
            String jobDefName = "ProcessJobDef";
            JobDefinition jobDef = null;
            MetadataObjectId jobDefId = null;
           
            jobDef = new JobDefinition(jobDefName, jobTypeId);
            jobDef.setDescription("Demo Process Type Job Definition " +
                                   jobDefName);
           
            plist = new ParameterList();
            plist.add("myJobdefProp", DataType.STRING, "myJobdefVal", false);
 
            pinfo = SystemProperty.getSysPropInfo(SystemProperty.
                                                  REDIRECTED_OUTPUT_FILE);
            plist.add(pinfo.getName(), pinfo.getDataType(), "/tmp/" + jobDefName 
                      + ".out", false);
 
            jobDef.setParameters(plist);
           
            jobDefId = metadata.addJobDefinition(mshandle, jobDef, "HOW_TO_PROD");
        }
        catch (Exception e)
        {
          [...]
        }
        finally
        {
            // Close metadata service handle in finally block.
            if (null != mshandle)
            {
                metadata.close(mshandle);
                mshandle = null;
            }
        }
    }

14.2.2 プロセス・タイプのジョブ定義を作成および格納する方法

プロセス・タイプのジョブを使用するには、ジョブ定義を作成して格納する必要があります。

ノート:

ジョブ・タイプを指定してジョブ定義を作成した後で、タイプやジョブ定義名を変更することはできません。ジョブ・タイプやジョブ定義名を変更するには、新しいジョブ定義を作成する必要があります。

例14-1に、ジョブ定義コンストラクタおよびジョブ・タイプを使用してジョブ定義を作成する方法を示します。表14-1に、ジョブ定義に関連付けられる一部のシステム・プロパティを示します。

例14-1に示すように、ジョブ定義を作成して格納する場合は、次を実行します。

  • JobDefinitionコンストラクタを使用して、String名およびメタデータに格納されているジョブ・タイプを指すMetadataObjectIDを指定します。

  • 新しいジョブ定義に対して適切なプロパティを設定します。

  • 「メタデータ・サービスへのアクセス」に示されているように、メタデータ・ポインタを取得します。次に、メタデータ・サービスaddJobDefinition()メソッドを使用して、ジョブ定義をメタデータ・リポジトリに格納し、MetadataObjectIDを返します。

14.3 プロセス・ジョブに対するエージェント・ハンドラの使用

Oracle Enterprise Schedulerで個別のプロセス・ジョブを管理するには、エージェント・ハンドラが必要です。エージェント・ハンドラは、プロセス・ジョブの実行を検証、生成、モニターおよび制御し、またプロセス・ジョブの終了ステータスをOracle Enterprise Schedulerに返します。

エージェント・ハンドラにより、Oracle Enterprise Schedulerの可用性のモニターやジョブ取消しリクエストの処理も行われます。ジョブが異常終了した(またはジョブの取消しリクエストが発行された)場合、エージェント・ハンドラは生成されたプロセスを(その子とともに)終了し、エージェント・ハンドラも終了します。これにより、オペレーティング・システム・タイプが検出され、適切なシステム・コールを使用して、プロセス・ジョブが起動、管理および終了されます。

Oracle Enterprise Schedulerのエージェント・ハンドラを使用して、そのログを/tmpフォルダに生成できます。ログの生成は、Oracle Enterprise Schedulerのログ・レベルをFINEFINERまたはFINESTに設定して、/tmpフォルダへの読取り権限および書込み権限を確保することによって有効化する必要があります。プロセス・ジョブの起動ごとにログ・ファイルが1つ生成されます。ログ・ファイルには、プロセス・ジョブの起動ログがリストされ、ここには、環境変数のリスト、プロセス・ジョブに対して指定されたコマンド行とリダイレクトされた出力ファイル、プロセス・ジョブのプロセスIDと終了コード、プロセスの生成中に検出されたエラーなどが含まれます。

14.3.1 エージェント・ハンドラの選択

Oracle Enterprise Schedulerでは、2つの異なるエージェント・ハンドラ、つまりJavaエージェント・ハンドラとPerlエージェント・ハンドラが提供されます。両方のエージェント・ハンドラの機能は同等ですが、Javaエージェント・ハンドラではWindowsでのterminate-spawned-process-on-restart動作がサポートされていないという点が異なります。

デフォルトで、Oracle Enterprise Schedulerでは、標準および拡張モードのリクエストにJavaエージェント・ハンドラが使用されます。Fusionモードでのリクエストには、常時、Perlのエージェント・ハンドラを使用します。標準および拡張リクエスト・モードでPerlのエージェント・ハンドラを使用するには、プロセスのジョブを実行しているホスティング・アプリケーションに関連付けられたess-config.xmlファイルに、次の例に示すようにPerlCommandプロパティを追加する必要があります。

<EssProperties>
   <EssProperty key="RequestFileDirectory" value="/tmp/ess/requestFileDirectory"/>
   <EssProperty key="RequestFileDirectoryShared" value="false"/>
     ...   
   <EssProperty key="PerlCommand" value="/usr/bin/perl"/>
</EssProperties>

ディレクトリ名などの環境に依存する値を指定するため、トークンの置換を使用できます。詳細は、「トークンおよび論理クラスタの使用」を参照してください。

Oracle Enterprise SchedulerのPerlエージェントには、Oracle Perlバージョン5.10以上が必要です。プロセス・ジョブをサポートするPerlをインストールする手順は、『Oracle Fusion Middleware Oracle Enterprise Schedulerの管理』の「プロセス・ジョブをサポートするPerlの構成」に記載されています。

ノート:

Fusion Applications環境でOracle Enterprise Schedulerを実行する場合、Perlエージェント・ハンドラを使用する必要があります。

14.4 プロセス・ジョブのロケール

個々のプロセス・ジョブは、実行時にプロセス・ジョブに適用されるロケール環境変数設定によって決定される様々なロケールおよびエンコーディングを使用できます。プロセス・ジョブでは、リクエストの完了後にOracle Enterprise Schedulerにより、リクエスト・ログおよび出力ファイルがコンテンツ・ストアにインポートされます。

プロセス・ジョブのロケール環境変数は、プロセス・ジョブ定義やホスティング・アプリケーションのess-config.xmlファイルなど、複数の場所で指定できます。プロセス・ジョブのロケール解決ロジックは、次の優先順位でリクエストに有効なLC_ALLおよびLANG環境変数を決定します。

  1. リクエストに関連付けられているSYS_environment(最も高い優先順位)

  2. ホスティング・アプリケーションのess-config.xmlファイル

  3. WebLogic Serverのロケール(最も低い優先順位)

すべてのプロセス・ジョブで、有効なロケールおよびエンコーディングは、前述の優先順位に基づいて決定されます(有効なLC_ALL値は有効なLANG値をオーバーライドします)このエンコーディングは、ログにのみ適用され、出力には適用されません。