プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Enterprise Schedulerアプリケーションの開発
12c (12.2.1.2.0)
E82775-01
目次へ移動
目次

前
次

15 スケジュールの定義および使用

この章では、Oracle Enterprise Schedulerジョブ定義に関連付けることができるスケジュールを定義して、ジョブ・リクエストが実行されるタイミングを指定したり、Oracle Enterprise Schedulerでの処理用に、時間ベースの制御を指定する作業シフトなどの管理アクションを含める方法について説明します。

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

15.1 スケジュールの概要

Oracle Enterprise Schedulerを使用してスケジュールを作成し、ジョブ・リクエストが実行されるタイミングを決定したり、作業割当てがアクティブになるタイミングを決定するなど、他の目的にもスケジュールを使用できます。スケジュールには、2012年7月14日などの、明示的な日付のリストを含めることができます。スケジュールには、繰り返される日付(または時間と日付)のセットを表す式を含めることもできます。

Oracle Enterprise Schedulerを使用して、次の1つ以上を含むスケジュールを作成します。

  • 明示的な日付: スケジュールまたは除外で使用する日付を定義します。

  • 繰返し: 繰り返される日付と時間のパターンを表す式を含めます。たとえば、毎週月曜日の10:00AMなど、定期的な時間を表す繰返しを指定できます。

  • 除外: スケジュールから除外する日付または日付と時間のリストを含めます。たとえば、除外を作成して、スケジュールから除外する休日のリストを含めることができます。

15.2 繰返しの定義

繰返しは、繰り返される日付と時間を表す式です。繰返しは、Oracle Enterprise SchedulerのRecurrenceオブジェクトを使用して指定します。Recurrenceオブジェクトは、スケジュールを作成するときに、または日付のリストを指定する除外で使用します。

Recurrenceコンストラクタを使用して、次のように繰返しを作成できます。

  • RecurrenceFieldsクラスで定義されているフィールド(DAY_OF_MONTHなど)を使用します。

  • iCalendar (RFC 2445)仕様に準拠する繰返し式を使用します。iCalendar RFC 2245式の使用の詳細は、次を参照してください。

    http://www.ietf.org/rfc/rfc2445.txt

注意:

繰返しを作成するとき、各繰返しインスタンスについて、これらの2つのメカニズムのいずれか1つのみを使用できます。

繰返しには、次のものも含まれます(これらは必須ではありません)。

  • 開始日: 繰返しパターンの開始時間および日付。

  • 終了日: 繰返しパターンの終了時間および日付。

  • カウント: 繰返しパターンのカウント。カウントは、オブジェクトによって最大何回生成されるかを示します。たとえば、毎週月曜日の10:00AMのような定期的な時間を表す繰返しを指定し、カウントに4を指定すると、この繰返しには月曜日が4回のみ含まれます。

開始日、終了日およびカウント属性は、繰返しのRecurrenceFieldsヘルパー・ベースのインスタンスまたはiCalendarベースのインスタンスのいずれかに対してのみ有効です。

Recurrenceオブジェクトのインスタンスが正しく定義された完全な繰返しパターンを表しているかどうかをチェックする繰返しのvalidate()メソッドを使用して、繰返しを検証できます。Recurrenceインスタンスは、日付または日付と時間の出現を生成するために最小限必要なフィールドを持っている場合に、完全とみなされます。

15.2.1 繰返しフィールド・ヘルパーによる繰返しの定義方法

繰返しフィールド・ヘルパーを使用して、繰返しを作成できます。RecurrenceFieldsヘルパー・クラスによって、繰返しパターンを指定するためのわかりやすい方法が提供されます。表15-1に、繰返しパターンを指定するために使用できる繰返しフィールド・ヘルパー・クラスを示します。


表15-1 繰返しフィールド・ヘルパー・パターン

繰返しフィールド 説明

DAY_OF_MONTH

日付を定義します。

DAY_OF_WEEK

曜日の列挙。

FREQUENCY

繰返しの繰返し頻度を定義します。選択肢は次のとおりです。

  • DAILY: 毎日の繰返しを示します。

  • HOURLY: 毎時の繰返しを示します。

  • MINUTELY: 毎分の繰返しを示します。

  • MONTHLY: 毎月の繰返しを示します。

  • SECONDLY: 毎秒の繰返しを示します。

  • WEEKLY: 毎週の繰返しを示します。

  • YEARLY: 毎年の繰返しを示します。

MONTH_OF_YEAR

月を定義します。

TIME_OF_DAY

時間を定義します。

WEEK_OF_MONTH

月の週の列挙。

YEAR

年の値をカプセル化します。


例15-1は、RecurrenceFieldsヘルパー・クラスを使用して作成された繰返しのサンプルを示しており、ここでは、開始日および終了日を使用せずに、週単位の頻度(毎週月曜日の10:00 a.m.)を指定しています。

例15-1では、次のことに注意してください。

  • スケジュールは、そのスケジュールを使用するジョブ・リクエストの発行時に、Oracle Enterprise Schedulerによって実行時に提供される開始時間で指定された時間にアクティブになります。

  • 間隔パラメータ1は、この繰返しにより出現が毎週生成されることを示します。この値は、頻度と間隔を乗算することによって算出します。

例15-2に、開始日および終了日のない、4時間ごとの繰返しのサンプルを示します。この繰返しは、RecurrenceFieldsヘルパー・クラスを使用して作成されており、時間単位の頻度、間隔の乗数の4、NULLの開始日およびNULLの終了日が指定されています。

例15-2では、次のことに注意してください。

  • スケジュールは、そのスケジュールを使用するジョブ・リクエストの発行時に、Oracle Enterprise Schedulerによって実行時に提供される開始時間で指定された時間にアクティブになります。

  • 間隔パラメータ4は、この繰返しにより出現が4時間ごとに生成されることを示します。この値は、頻度と間隔を乗算することによって算出します。

例15-3に、RecurrenceFieldsヘルパー・クラスを使用して作成され、月単位の頻度が指定された繰返しのサンプルを示します。

例15-3では、次の特性のある繰返しを指定しています。

  • 値が1の間隔パラメータが含まれており、これにより、繰返しによって出現が毎月生成されることを指定しています。

  • 月の週の指定が含まれており、2週目を指定しています。

  • 曜日の指定(火曜日)が含まれています。

  • 時間の指定が含まれており、値は11:00です。

例15-4に、RecurrenceFieldsヘルパー・クラスを使用して作成され、月単位の頻度と開始日時が指定された繰返しのサンプルを示します。

例15-4では、次の特性のある繰返しを定義しています。

  • 終了日がNULLとして指定され、これは終了日がないことを意味します。

  • この繰返しを使用すると、開始日がCalendarインスタンスcalで指定され、その値はset()メソッド・コールで設定されます。

例15-1 週単位の頻度による繰返しの定義

Recurrence recur1 = 
      new Recurrence(RecurrenceFields.FREQUENCY.WEEKLY, 1, null, null);
recur1.addDayOfWeek(RecurrenceFields.DAY_OF_WEEK.MONDAY);
recur1.setRecurTime(RecurrenceFields.TIME_OF_DAY.valueOf(10, 0, 0));
recur1.validate();
 

例15-2 4時間ごとの頻度による繰返しの定義

Recurrence recur2 = 
    new Recurrence(RecurrenceFields.FREQUENCY.HOURLY, 4, null, null);
    recur2.validate();

例15-3 月単位の頻度による繰返しの定義

Recurrence recur3 = 
   new Recurrence(RecurrenceFields.FREQUENCY.MONTHLY, 1, null, null);
recur3.addWeekOfMonth(RecurrenceFields.WEEK_OF_MONTH.SECOND);
recur3.addDayOfWeek(RecurrenceFields.DAY_OF_WEEK.TUESDAY);
recur3.setRecurTime(RecurrenceFields.TIME_OF_DAY.valueOf(11, 00, 00));
recur3.validate();

例15-4 開始日時が指定された繰返しの定義

 Calendar cal = Calendar.getInstance();
 cal.set(Calendar.YEAR, 2007);
 cal.set(Calendar.MONTH, Calendar.JULY);
 cal.set(Calendar.DAY_OF_MONTH, 1);
 cal.set(Calendar.HOUR, 9);
 cal.set(Calendar.MINUTE, 0);
 cal.set(Calendar.SECOND, 0);
 Recurrence recur4 = new Recurrence(RecurrenceFields.FREQUENCY.WEEKLY,
                                   1,
                                   cal,
                                   null);
 recur4.validate();

15.2.2 iCalendar RFC 2445仕様による繰返しの定義方法

RecurrenceコンストラクタとiCalendar (RFC 2445)仕様を含むStringをともに使用して、繰返しパターンを指定できます。

iCalendar RFC 2245式の使用の詳細は、次のリンクを参照してください。

http://www.ietf.org/rfc/rfc2445.txt

例15-5に、iCalendar式を使用して作成された繰返しのサンプルを示します。

注意:

iCalendar式では、次のものはサポートされていません

COUNTUNTILBYSETPOSWKST

setCountメソッドを使用して、Recurrenceオブジェクトにカウントを直接指定できます。

例15-5 iCalendar文字列式を使用した繰返しの定義

Recurrence recur5 = new Recurrence("FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=2MO;");
recur5.validate();

15.2.3 繰返しフィールド・ヘルパーの使用に関する必知事項

RecurrenceFieldsヘルパーを使用して繰返しを定義する場合は、次のことに注意してください。

  • RecurrenceFieldsヘルパー・クラスを使用して繰返しパターンを定義する場合、いずれかのRecurrenceFields.FREQUENCY定数を使用して頻度を指定することが、常に必須となります(頻度の詳細は、表15-1を参照してください)。

  • 繰返しコンストラクタにおいて指定される頻度間隔は、指定された頻度の乗数として使用される整数です。たとえば、頻度がRecurrenceFields.FREQUENCY.HOURLYであり、間隔が8の場合、この組合せは8時間ごとを表します。

  • 開始日または終了日の指定はオプションです。ただし、開始日または終了日が指定された場合、開始日より前および終了日より後(指定されている場合は、関連付けられた開始時間より前および終了時間より後)には、オブジェクトによって出現が生成されないことが保証されます。

  • 通常、開始日と繰返しフィールドの両方が使用される場合、繰返しフィールドが常に優先されます。この制限は、次のことを意味します。

    • 開始日とRecurrenceFieldsの頻度フィールドのみが指定されている場合、頻度フィールドを使用して、その開始日を最初の出現とする出現が開始日によって定義されます。たとえば、開始日が01-MAY-2007:09:00:00、RecurrenceFields.FREQUENCYWEEKLYと指定されており、他の繰返しフィールドが使用されていない場合、出現は01-MAY-2007:09:00:00から毎週1回発生します(さらに、08-MAY-2007:09:00:00、15-MAY-2007:09:00:00と続きます)。

      つまり、開始日を頻度フィールドの指定とともに指定することによって、繰返しパターンを簡単に定義できます。

    • 開始日または終了日がその他の繰返しフィールドとともに指定される場合は、繰返しフィールドが優先され、開始日または終了日は絶対的な境界点としてのみ使用されます。たとえば、開始日が01-MAY-2007:09:00:00、頻度がWEEKLYと指定されている場合に、追加の繰返しフィールドDAY_OF_WEEKに値WEDNESDAYを指定して使用すると、出現は01-MAY-2007直後の水曜日から毎週水曜日に発生します。01-MAY-2007は火曜日であるため、最初の出現は01-MAY-2007:09:00:00ではなく、02-MAY-2007:09:00:00に発生します。

      この場合、開始日が01-MAY-2007:09:00:00で、TIME_OF_DAYも11:00:00に指定された場合、すべての出現は11:00:00に発生し、開始日に指定された時間の09:00:00がオーバーライドされます。

  • 頻度のみが指定され、繰返しに開始日、開始時間およびTIME_OF_DAYフィールドのいずれも含まれない場合、Oracle Enterprise Schedulerによって実行時に提供されるタイムスタンプに基づいて、出現が発生します(通常、このタイムスタンプはリクエスト発行時に提供されます)。

    たとえば、繰返しで2時間ごとの繰返しが指定されている場合、ジョブ・リクエストの発行時間によって出現の開始時間が決まります。つまり、そのような場合、ジョブ・リクエストの出現はそれぞれ2時間ごとになりますが、複数のジョブ・リクエストが発行されると、それぞれの開始時間は異なり、各ジョブ・リクエストのリクエスト発行時に設定されます。

  • 開始日を使用しない場合は、繰返しパターンが完全に定義されるように繰返しフィールドを含めることができます。たとえば、MONTH_OF_YEARのみを指定し、開始日がともに指定されない場合、繰返しパターンは定義されません。開始日が指定されない場合に、パターンを定義するために必要な最小繰返しフィールド数は、使用される頻度の値に応じて異なります。たとえば、頻度がWEEKLYの場合、週単位の出現が発生する曜日を定義するには、DAY_OF_WEEKおよびTIME_OF_DAYのみで十分です。頻度がYEARLYの場合に、繰返しパターンを定義するには、MONTH_OF_YEARDAY_OF_MONTH(またはWEEK_OF_MONTHおよびDAY_OF_WEEK)およびTIME_OF_DAYで十分です。

  • 頻度フィールドを除き、繰返しフィールドには複数の値を指定できます。ただし、実行時、無効な組合せは、Oracle Enterprise Schedulerによって警告なしでスキップされます。たとえば、MONTH_OF_YEARが1月から6月と指定され、DAY_OF_MONTHが30と指定される場合、繰返しでは無効な日(2月の30日)がスキップされます。

15.2.4 iCalendar式の使用に関する必知事項

iCalendar式で繰返しを定義する場合は、次のことに注意してください。

  • 繰返しに開始日および時間のいずれも含まれず、iCalendar式で時間が指定されない場合、Oracle Enterprise Schedulerによって実行時に提供されるタイムスタンプに基づいて、出現が発生します(通常、このタイムスタンプはリクエスト発行時に提供されます)。

    たとえば、繰返しで2時間ごとの繰返しを指定でき、ジョブ・リクエストの発行の開始日時によって出現の具体的な開始時間が決まります。このように開始時間が指定されないと、異なるジョブ・リクエストの出現の発生時間は、各リクエストの発行時間に応じて異なる場合がありますが、個々の出現の間隔は2時間です。

  • setStartDate()による開始日の指定またはsetEndDate()による終了日の指定はオプションです。ただし、開始日または終了日が指定された場合、開始日より前および終了日より後(指定されている場合は、関連付けられた開始時間より前および終了時間より後)には、オブジェクトによって出現が生成されないことが保証されます。

15.3 明示的な日付の定義

明示的な日付により、スケジュールまたは除外で使用される日時が定義されます。RecurrenceFieldsクラスの適切なフィールドを使用して、ExplicitDateを構築します。

15.3.1 明示的な日付の定義方法

例15-6に明示的な日付の定義を示します。

例15-6 明示的な日付の定義

ExplicitDate date = new ExplicitDate(RecurrenceFields.YEAR.valueOf(2007), RecurrenceFields.MONTH_OF_YEAR.AUGUST,RecurrenceFields.DAY_OF_MONTH.valueOf(17));

例15-6では、RecurrenceFieldsヘルパーによりコンストラクタ内で日付が定義され、値には時間が含まれていません。オプションでsetTimeを使用して、明示的な日付に関連付けられる時間を設定できます。

15.3.2 明示的な日付に関する必知事項

時間部分が指定されないjava.util.Calendarと比較した場合、ExplicitDateクラスでは部分的な日付を定義できます。さらに、TimeZoneなどのその他すべてのjava.util.Calendarフィールドは、ExplicitDateとともには定義されません。ExplicitDateで時間部分が指定されない場合、Oracle Enterprise Schedulerにより適切な時間が算出されます。たとえば、2007年6月1日より後の毎週月曜日を示すスケジュールがあるとし、2007年8月17日(金曜日)の明示的な日付を追加するとします。この例では、2007年8月17日には時間が含まれていないため、これは部分的な日付です。

15.4 除外の定義および格納

Oracle Enterprise Schedulerの除外を使用して、スケジュールから除外する必要がある日付を表すことができます。たとえば、除外を使用して、スケジュールでスキップする休日のリストを作成できます。

15.4.1 除外の定義方法

Exclusionオブジェクトを使用して、個別の除外を表します。ExplicitDateまたはRecurrenceオブジェクトのいずれかを使用して、除外で除外する日付を定義できます。

例15-7に、繰返しを使用してExclusionインスタンスを作成する方法を示します。

例15-7では、個別の除外を定義しています。除外のリストの作成の詳細は、「除外定義の作成方法」を参照してください。

例15-7 明示的な日付および除外の定義

Recurrence recur = new Recurrence(RecurrenceFields.FREQUENCY.YEARLY, 1);
recur.addMonth(RecurrenceFields.MONTH_OF_YEAR.JULY);
recur.addDayOfMonth(RecurrenceFields.DAY_OF_MONTH.valueOf(4));
Exclusion e = new Exclusion("Independence Day", recur);

15.4.2 除外定義の作成方法

除外のリストを作成して、除外日を維持するには、次を実行します:

  1. 除外のリストを作成します。
  2. 除外のリストを使用して、ExclusionsDefinitionオブジェクトを定義します。
  3. メタデータ・サービスのaddExclusionDefinition()メソッドを使用して、ExclusionsDefinitionを維持します。

例15-8 ExlusionDefinitionでの除外のリストの作成および格納

Collection<Exclusion> exclusions = new ArrayList<Exclusion>();
Exclusion e = new Exclusion("Independence Day", recur);
exclusions.add(e);
ExclusionsDefinition exDef1 = 
new ExclusionsDefinition("OrclHolidays1", "Annual Holidays", exclusions);
MetadataServiceHandle handle = m_service.open();
MetadataObjectId exId1 = m_service.addExclusionDefinition(handle,exDef1,
"METADATA_UNITTEST_PROD");

最後に、ExclusionsDefinitionをスケジュールに関連付ける場合は、スケジュールのaddExclusion()メソッドを使用します。

例15-8に、ExclusionDefinitionを作成して、メタデータ・リポジトリに定義を格納する方法を示します。

例15-8では、ExclusionsDefinitionコンストラクタに3つの引数が必要であることに注意してください。

15.5 スケジュールの定義および格納

Oracle Enterprise Schedulerを使用してスケジュールを作成し、ジョブ・リクエストが実行されるタイミングを決定したり、他の目的にもスケジュールを使用できます(作業割当てがアクティブになるタイミングを決定するなど)。スケジュールには、2007年6月13日などの明示的な日付のリスト、または繰り返される日付や日付および時間を表す式のセットが含まれます。スケジュールでは、特定の除外および包含日付も指定できます。

次のものを使用してスケジュールを作成します。

  • 明示的な日付: スケジュールまたは除外で使用する日付を定義します。詳細は、「明示的な日付の定義」を参照してください

  • 繰返し: 繰り返される日付と時間のパターンを表す式を含めます。たとえば、毎週月曜日の10:00AMなど、定期的な時間を表す繰返しを指定できます。詳細は、「繰返しの定義」を参照してください

  • 除外: スケジュールから除外する日付または日付と時間のリストを含めます。たとえば、除外を作成して、スケジュールから除外する休日のリストを含めることができます。詳細は、「除外の定義および格納」を参照してください

15.5.1 スケジュールの定義および格納方法

スケジュールを定義する手順は、次のとおりです。

  1. Oracle Enterprise SchedulerのScheduleオブジェクトを定義し、新しいスケジュールを作成するためのスケジュール・コンストラクタを使用して、スケジュールを作成します。
  2. メタデータ・サービス参照m_metadataServiceを取得し、MetadataServiceHandleを使用して、tryブロック内でメタデータ・セッションを開きます。
    MetadataObjectId scheduleId = m_service.addScheduleDefinition(handle,schedule,"HOW_TO_PROD");
    
  3. 日付、繰返しおよび除外を定義します。
  4. addScheduleDefinitionを使用してスケジュールを格納します。
  5. finallyブロックでセッションを閉じます。

15.5.2 スケジュールの定義および格納時の処理内容

例15-9に、毎週月曜日の10:00AMに実行するように指定された、週次スケジュールのRecurrenceFieldsヘルパー・クラスを持つ繰返しを使用したスケジュール定義のサンプルを示します。

このスケジュールでは、addInclusionDate()メソッドを使用してスケジュール内の出現に明示的な日付を追加し、addExclusionDate()メソッドを使用してスケジュールの出現から5月15日の日付を明示的に除外します。

例15-10に、スケジュールを格納するために使用されるサンプル・コードを示します。メソッドaddScheduleDefinition()は、tryブロック内でスケジュールを格納するために使用され、その後にエラー処理を含むfinallyブロックが続きます。

例15-9 RecurrenceFieldsヘルパーを使用したスケジュールの繰返しの作成

Recurrence recur = new Recurrence(RecurrenceFields.FREQUENCY.WEEKLY, 1);
 recur.addDayOfWeek(RecurrenceFields.DAY_OF_WEEK.MONDAY);
 recur.setRecurTime(RecurrenceFields.TIME_OF_DAY.valueOf(10, 0, 0));
 
 ExplicitDate july10 = new ExplicitDate(RecurrenceFields.YEAR.valueOf(2008),
                                      RecurrenceFields.MONTH_OF_YEAR.JULY,
                                      RecurrenceFields.DAY_OF_MONTH.valueOf(10));
                                      
 ExplicitDate may15 = new ExplicitDate(RecurrenceFields.YEAR.valueOf(2008),
                                      RecurrenceFields.MONTH_OF_YEAR.MAY,
                                      RecurrenceFields.DAY_OF_MONTH.valueOf(15));
 
 Schedule schedule = new Schedule("everyMonday", "Weekly Schedule", recur);
 schedule.addInclusionDate(july10);
 schedule.addExclusionDate(may15);

例15-10 スケジュールの格納

MetadataServiceHandle handle = null;
boolean abort = true;
try
   {
      handle = m_service.open();
      m_service.addScheduleDefinition(handle, schedule, "HOW_TO_PROD");
      abort = false;
   }
finally
   {
      if (handle != null)
      {
         m_service.close(handle, abort);
      }
   }

15.5.3 スケジュールでのタイムゾーンの処理に関する必知事項

java.util.TimeZoneオブジェクトを使用して、スケジュールにタイムゾーンを設定できます。スケジュールのsetTimeZone()メソッドを使用して、スケジュールのTimeZoneを設定するか消去します。スケジュール・オブジェクトにTimeZoneが設定されている場合は、スケジュール・メソッドgetTimeZone()によってjava.util.TimeZone値が返されます。

15.6 特定のスケジュールを使用するジョブ・リクエストの識別

Fusion Middleware Controlを使用して、特定のスケジュールを使用するジョブ・リクエストを検索できます。

特定のスケジュールを使用するジョブ・リクエストの検索の詳細は、『Oracle Fusion Middleware Oracle Enterprise Schedulerの管理』の「Oracle Enterprise Schedulerリクエストの管理」、Oracle Enterprise Schedulerジョブ・リクエストの検索に関する項を参照してください。

15.7 スケジュールの更新および削除

Fusion Middleware Controlを使用して、スケジュールを編集および削除できます。

スケジュールの編集および削除の詳細は、『Oracle Fusion Middleware Oracle Enterprise Schedulerの管理』の「Oracle Enterprise Schedulerリクエストの管理」、スケジュールの管理に関する項を参照してください。