18 ジョブ非互換性の定義および使用

この章では、Oracle Enterprise Schedulerのジョブ非互換性の使用方法について説明します。この機能を使用して、同時に実行できないジョブ・リクエストを指定できます。

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

ジョブ・リクエストの作成および発行方法の詳細は、「PL/SQLジョブの作成と使用」および「プロセス・ジョブの作成と使用」を参照してください。ジョブ・セットの使用の詳細は、「ジョブ・セットの定義および使用」を参照してください。

ノート:

説明を単純化するために、この非互換性の章ではジョブ定義についてのみ言及しますが、ここでの説明は、すべての場合において、ジョブ定義とジョブ・セットの両方に当てはまります。

18.1 ジョブ非互換性の使用の概要

それぞれの非互換性については、グローバルな非互換性とドメイン(プロパティベース)の非互換性のいずれかが指定されます。Oracle Enterprise Schedulerでは、oracle.as.scheduler.Incompatibility Javaクラスによって表される非互換性定義に基づき、ジョブ定義またはジョブ・セットの間の非互換性がサポートされています。IncompatibilityType列挙によって、有効な非互換性タイプが指定されます。

  • ドメイン固有(DOMAIN): この場合、1つ以上のジョブ定義がリソースのスコープ内で非互換としてマークされ、リソースはシステム・プロパティ名またはユーザー定義パラメータ名によって識別されます。非互換性を定義するために使用するジョブ定義ごとに、プロパティ名を指定する必要があります。互換性のないジョブに対するリクエストのリソースの値が同じ場合、Oracle Enterprise Schedulerにより、これらが同時に実行されないようにできます。parameterVOを介して指定されたパラメータは、プロパティ名submit.argument1、... submit.argument#を持つリクエスト・プロパティとして発行されます。ドメイン非互換性プロパティとしてこのようなパラメータを使用するには、非互換性プロパティ名にsubmit.argument1、... submit.argument#を指定します。

  • グローバル(GLOBAL): この場合、1つ以上のジョブ定義が、リソースやプロパティに関係なく非互換としてマークされます。Oracle Enterprise Schedulerにより、互換性のないジョブに対するリクエストが同時に実行されないようにできます。

Oracle Enterprise Schedulerの非互換性定義により、グローバルな非互換性とドメイン(プロパティベース)の非互換性のいずれかが指定されます。非互換性は1つ以上のエンティティ(ジョブ定義またはジョブ・セット)、およびこれらのエンティティが非互換となる必要があるリソースで構成されています。グローバルの非互換性にリソースは指定しません。各エンティティには、自己非互換としてフラグを付けることができます。非互換性が1つのエンティティにのみ定義されている場合、そのエンティティに自己非互換としてフラグを付ける必要があります。Oracle Enterprise Schedulerでは、1つのエンティティがドメイン(プロパティベース)のエンティティを表し、別のエンティティがグローバルな(プロパティのない)エンティティを表す混合モードはサポートされていません。

ドメインの非互換性の場合、リソースは非互換性のエンティティごとに異なる場合があるプロパティ名によって表されます。たとえば、ドメインの非互換性が2つのジョブ定義(JobAとJobB)に対して作成される場合、各エンティティに対して識別されるリソース(プロパティ)のプロパティ名は、JobAとJobBで異なることがあります。これはJobAでfooと呼ばれ、JobBでfoo2と呼ばれる可能性があります。Oracle Enterprise Schedulerでは、JobAに対するリクエストとJobBに対するリクエストのそれぞれのプロパティ値が同じである場合、これらのリクエストは互換性がないとみなされ、同時に実行されることはありません。リクエストのそれぞれのプロパティ値が異なる場合、これらのリクエストは互換性があるとみなされ、同時に実行できます。

非互換性定義により、別のジョブ定義と互換性のないジョブ定義が指定されます。指定されたジョブ定義により、任意の非互換性定義を直接指したり参照することはありません。

Oracle Enterprise Schedulerにより、リクエストが最初に実行されるときにリクエストのジョブ定義を参照する非互換性定義(ある場合)が決定されます。また、その際に任意のドメインの非互換性に対するリソース(プロパティ)値も決定されます。この情報はリクエストのライフ・サイクルの後続の処理全体(リクエストの再試行を含む)を通して使用されます。ジョブ・セット・リクエストの場合、個別のステップ・リクエストが実行されるときではなく最上位のジョブ・セット・リクエストが実行されるときに、Oracle Enterprise Schedulerにより、潜在的なジョブ・セット・ステップのジョブ定義を参照する非互換性定義(ある場合)が決定されます。

スケジュールベースの発行の場合、Oracle Enterprise Schedulerにより、スケジュールのインスタンスに新しい子リクエストが作成されます。指定した時間に実行されるインスタンスは1つのみです。インスタンス・リクエストが最初に実行されるときに、Oracle Enterprise Schedulerにより、非互換性定義に行われたメタデータ変更が追跡され、非互換性定義(ある場合)がリフレッシュされる場合があります。これは、次のインスタンス・リクエストが実行されるときに使用される非互換性定義が、前のインスタンス・リクエストが実行されたときに使用された非互換性定義と異なる場合があることを意味します。

18.1.1 ジョブの自己非互換性

ジョブ定義またはジョブ・セットは、それら自体と互換性がない場合、自己非互換として定義できます。自己非互換とは、単一のジョブ定義に関連付けられる複数のジョブ・リクエストを同時に実行できないことを意味します。単一のエンティティが自己非互換としてマークされる場合、非互換性定義にそのエンティティを含めることができます。グローバルな自己非互換性では、特定のジョブまたはジョブ・セット定義に対する複数のリクエストは同時に実行されません。プロパティベースの自己非互換性では、特定のジョブまたはジョブ・セット定義に対するリクエストは、プロパティ値が同じである場合、同時に実行されません。

18.2 Oracle JDeveloperとの非互換性の定義

次のことを指定することによって、Oracle JDeveloperにおける非互換性を定義できます。

  • 非互換性の名前とパッケージ

  • 非互換性タイプ

  • 非互換性のエンティティおよび自己非互換性の有無

  • ドメイン固有の非互換性の場合には、エンティティごとの非互換性に関連付けられるプロパティ

18.2.1 グローバルな非互換性の定義方法

Oracle Enterprise Schedulerのグローバルな非互換性は、名前、パッケージおよびエンティティによって定義されます。

グローバルな非互換性を作成するには:

  1. Oracle JDeveloperで、プロジェクト内で右クリックして「新規ギャラリ」を表示します。

  2. 「カテゴリ」「ビジネス層」を展開し、「エンタープライズ・スケジューラ・メタデータ」を選択します。

  3. 「アイテム」「非互換性」を選択して、「OK」をクリックします。これにより、図18-1に示すように、「非互換性の作成」ウィンドウが表示されます。

    図18-1 「非互換性の作成」ウィンドウ

    図18-1の説明が続きます
    「図18-1 「非互換性の作成」ウィンドウ」の説明
  4. 「非互換性の作成」ダイアログを使用して、次を指定します。

    1. 「名前」フィールドで、非互換性の名前を入力するか、またはデフォルト名前をそのまま使用します。

    2. 「パッケージ」フィールドで、非互換性のパッケージ名を入力します。

    3. 「場所」フィールドに非互換性ファイルが格納されているディレクトリのフルパスが表示されます。

    4. 「非互換性タイプ」フィールドで「グローバル」を選択し、「OK」をクリックします。

      非互換性が作成され、非互換性定義ページが表示されます。

  5. 「非互換性エディタ」ペインの「説明」フィールドで、非互換性の説明を入力します。

  6. 「エンティティ」領域で、「追加」をクリックしてエンティティを追加します。これにより、図18-2に示すように、「エンティティの追加」ダイアログが表示されます。

    図18-2 非互換性の「エンティティの追加」ウィンドウ

    図18-2の説明が続きます
    「図18-2 非互換性の「エンティティの追加」ウィンドウ」の説明
  7. 非互換性に対して1つ以上のエンティティを選択して、「OK」をクリックします。非互換性エディタが表示されます。

  8. 自己非互換性を指定するか、またはエンティティを変更するには、「エンティティ」領域内のエンティティをダブルクリックします。これにより、図18-3に示すように、「エンティティの編集」ダイアログが表示されます。

    図18-3 グローバルな非互換性の「エンティティの編集」ウィンドウ

    図18-3の説明が続きます
    「図18-3 グローバルな非互換性の「エンティティの編集」ウィンドウ」の説明
  9. 自己非互換性を指定するには、「自己非互換」を選択します。

  10. 非互換性を保存します。

18.2.2 ドメインの非互換性の定義方法

Oracle Enterprise Schedulerのドメインの非互換性は、名前、パッケージ、エンティティおよび各エンティティのプロパティによって定義されます。

非互換性を作成するには:

  1. Oracle JDeveloperで、プロジェクト内で右クリックして「新規ギャラリ」を表示します。

  2. 「カテゴリ」「ビジネス層」を展開し、「エンタープライズ・スケジューラ・メタデータ」を選択します。

  3. 「アイテム」「非互換性」を選択して、「OK」をクリックします。これにより、「非互換性の作成」ウィンドウが表示されます。

  4. 「非互換性の作成」ダイアログを使用して、次を指定します。

    1. 「名前」フィールドで、非互換性の名前を入力するか、またはデフォルト名前をそのまま使用します。

    2. 「パッケージ」フィールドで、必要に応じて非互換性のパッケージ名を入力します。

    3. 「場所」フィールドに非互換性ファイルが格納されているディレクトリのフルパスが表示されます。

    4. 図18-4に示すように、「非互換性タイプ」フィールドで「ドメイン」を選択します。

      図18-4 「非互換性の作成」ウィンドウ

      図18-4の説明が続きます
      「図18-4 「非互換性の作成」ウィンドウ」の説明

      「OK」をクリックします。これにより非互換性が作成され、「非互換性エディタ」が表示されます。

  5. 「非互換性エディタ」ペインの「説明」フィールドで、非互換性の説明を入力します。

  6. 「非互換性エンティティ」領域で、「追加」をクリックします。

    「エンティティの追加」ウィンドウが表示されます。

  7. 非互換性に追加する1つ以上のジョブまたはジョブ・セットを選択して、「OK」をクリックします。

    非互換性エディタが表示されます。

  8. 自己非互換性を指定するか、またはエンティティやそのプロパティを変更するには、「エンティティ」フィールドでエンティティをダブルクリックします。

    図18-5に示すように、「エンティティの編集」ウィンドウが表示されます。

    図18-5 非互換性の「エンティティの編集」ウィンドウ

    図18-5の説明が続きます
    「図18-5 非互換性の「エンティティの編集」ウィンドウ」の説明
  9. 自己非互換性を指定するには、「自己非互換」を選択します。

  10. 非互換性を保存します。

18.3 ジョブ非互換性を処理するために実行時に行われる処理

実行時、Oracle Enterprise Schedulerによって、非互換性タイプのグローバルまたはドメイン(プロパティベース)に応じて非互換性定義が処理されます。

ジョブ・リクエストが実行されるときに、Oracle Enterprise Schedulerによって、リクエストの発行に使用されるジョブまたはジョブ・セット定義を参照する非互換性定義が決定されます。各ドメインの非互換性について、その非互換性に使用するリソースまたはプロパティの値も決定されます。すでに実行中の非互換性リクエストがあるかどうかを決定するためにOracle Enterprise Schedulerによって確認されます。そうである場合、リクエストは、そのリクエストが互換性のないすべてのリクエストが完了するまでブロックされます。

ノート:

ドメイン非互換性のプロパティの値が、リクエストの実行時にリクエスト・パラメータから取得されます。通常、値はリクエストの発行時に指定されたジョブ定義またはリクエスト・パラメータのいずれかに基づきます。このようなパラメータが見つからない場合、この非互換性は、後続のリクエスト処理で無視されます。この非互換性定義に関して、リクエストは他のリクエストと互換性を持ちます。初期プロパティ値は、プロパティが後で変更された場合も、非互換性リソース値として使用されます。

18.3.1 互換性のない親リクエストを含むサブリクエストについての処理

別のリクエストと互換性のないリクエストは、そのリクエストのサブリクエスト(子)とも互換性がありません。サブリクエストの親によってブロックされたリクエストは、サブリクエストが実行される間、およびサブリクエストの親リクエストが再開されて完了するまでブロックされたままとなります。