この章では、Oracle Enterprise Schedulerジョブ定義に関連付けることができるスケジュールを定義して、ジョブ・リクエストが実行されるタイミングを指定したり、Oracle Enterprise Schedulerでの処理用に、時間ベースの制御を指定する作業シフトなどの管理アクションを含める方法について説明します。
この章の内容は次のとおりです。
Oracle Enterprise Schedulerを使用してスケジュールを作成し、ジョブ・リクエストが実行されるタイミングを決定したり、作業割当てがアクティブになるタイミングを決定するなど、他の目的にもスケジュールを使用できます。スケジュールには、2012年7月14日などの、明示的な日付のリストを含めることができます。スケジュールには、繰り返される日付(または時間と日付)のセットを表す式を含めることもできます。
Oracle Enterprise Schedulerを使用して、次の1つ以上を含むスケジュールを作成します。
明示的な日付: スケジュールまたは除外で使用する日付を定義します。
繰返し: 繰り返される日付と時間のパターンを表す式を含めます。たとえば、毎週月曜日の10:00AMなど、定期的な時間を表す繰返しを指定できます。
除外: スケジュールから除外する日付または日付と時間のリストを含めます。たとえば、除外を作成して、スケジュールから除外する休日のリストを含めることができます。
繰返しは、繰り返される日付と時間を表す式です。繰返しは、Oracle Enterprise SchedulerのRecurrence
オブジェクトを使用して指定します。Recurrence
オブジェクトは、スケジュールを作成するときに、または日付のリストを指定する除外で使用します。
Recurrence
コンストラクタを使用して、次のように繰返しを作成できます。
RecurrenceFields
クラスで定義されているフィールド(DAY_OF_MONTH
など)を使用します。
iCalendar (RFC 2445)仕様に準拠する繰返し式を使用します。iCalendar RFC 2245式の使用の詳細は、次を参照してください。
注意:
繰返しを作成するとき、各繰返しインスタンスについて、これらの2つのメカニズムのいずれか1つのみを使用できます。
繰返しには、次のものも含まれます(これらは必須ではありません)。
開始日: 繰返しパターンの開始時間および日付。
終了日: 繰返しパターンの終了時間および日付。
カウント: 繰返しパターンのカウント。カウントは、オブジェクトによって最大何回生成されるかを示します。たとえば、毎週月曜日の10:00AMのような定期的な時間を表す繰返しを指定し、カウントに4を指定すると、この繰返しには月曜日が4回のみ含まれます。
開始日、終了日およびカウント属性は、繰返しのRecurrenceFields
ヘルパー・ベースのインスタンスまたはiCalendarベースのインスタンスのいずれかに対してのみ有効です。
Recurrence
オブジェクトのインスタンスが正しく定義された完全な繰返しパターンを表しているかどうかをチェックする繰返しのvalidate()
メソッドを使用して、繰返しを検証できます。Recurrence
インスタンスは、日付または日付と時間の出現を生成するために最小限必要なフィールドを持っている場合に、完全とみなされます。
繰返しフィールド・ヘルパーを使用して、繰返しを作成できます。RecurrenceFields
ヘルパー・クラスによって、繰返しパターンを指定するためのわかりやすい方法が提供されます。表15-1に、繰返しパターンを指定するために使用できる繰返しフィールド・ヘルパー・クラスを示します。
表15-1 繰返しフィールド・ヘルパー・パターン
繰返しフィールド | 説明 |
---|---|
|
日付を定義します。 |
|
曜日の列挙。 |
|
繰返しの繰返し頻度を定義します。選択肢は次のとおりです。
|
|
月を定義します。 |
|
時間を定義します。 |
|
月の週の列挙。 |
|
年の値をカプセル化します。 |
例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();
Recurrence
コンストラクタとiCalendar (RFC 2445)仕様を含むString
をともに使用して、繰返しパターンを指定できます。
iCalendar RFC 2245式の使用の詳細は、次のリンクを参照してください。
http://www.ietf.org/rfc/rfc2445.txt
例15-5に、iCalendar式を使用して作成された繰返しのサンプルを示します。
注意:
iCalendar式では、次のものはサポートされていません。
COUNT
、UNTIL
、BYSETPOS
、WKST
setCount
メソッドを使用して、Recurrence
オブジェクトにカウントを直接指定できます。
例15-5 iCalendar文字列式を使用した繰返しの定義
Recurrence recur5 = new Recurrence("FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=2MO;"); recur5.validate();
RecurrenceFields
ヘルパーを使用して繰返しを定義する場合は、次のことに注意してください。
RecurrenceFields
ヘルパー・クラスを使用して繰返しパターンを定義する場合、いずれかのRecurrenceFields.FREQUENCY
定数を使用して頻度を指定することが、常に必須となります(頻度の詳細は、表15-1を参照してください)。
繰返しコンストラクタにおいて指定される頻度間隔は、指定された頻度の乗数として使用される整数です。たとえば、頻度がRecurrenceFields.FREQUENCY.HOURLY
であり、間隔が8の場合、この組合せは8時間ごとを表します。
開始日または終了日の指定はオプションです。ただし、開始日または終了日が指定された場合、開始日より前および終了日より後(指定されている場合は、関連付けられた開始時間より前および終了時間より後)には、オブジェクトによって出現が生成されないことが保証されます。
通常、開始日と繰返しフィールドの両方が使用される場合、繰返しフィールドが常に優先されます。この制限は、次のことを意味します。
開始日とRecurrenceFields
の頻度フィールドのみが指定されている場合、頻度フィールドを使用して、その開始日を最初の出現とする出現が開始日によって定義されます。たとえば、開始日が01-MAY-2007:09:00:00、RecurrenceFields.FREQUENCY
がWEEKLY
と指定されており、他の繰返しフィールドが使用されていない場合、出現は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_YEAR
、DAY_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日)がスキップされます。
iCalendar式で繰返しを定義する場合は、次のことに注意してください。
繰返しに開始日および時間のいずれも含まれず、iCalendar式で時間が指定されない場合、Oracle Enterprise Schedulerによって実行時に提供されるタイムスタンプに基づいて、出現が発生します(通常、このタイムスタンプはリクエスト発行時に提供されます)。
たとえば、繰返しで2時間ごとの繰返しを指定でき、ジョブ・リクエストの発行の開始日時によって出現の具体的な開始時間が決まります。このように開始時間が指定されないと、異なるジョブ・リクエストの出現の発生時間は、各リクエストの発行時間に応じて異なる場合がありますが、個々の出現の間隔は2時間です。
setStartDate()
による開始日の指定またはsetEndDate()
による終了日の指定はオプションです。ただし、開始日または終了日が指定された場合、開始日より前および終了日より後(指定されている場合は、関連付けられた開始時間より前および終了時間より後)には、オブジェクトによって出現が生成されないことが保証されます。
明示的な日付により、スケジュールまたは除外で使用される日時が定義されます。RecurrenceFields
クラスの適切なフィールドを使用して、ExplicitDate
を構築します。
時間部分が指定されないjava.util.Calendar
と比較した場合、ExplicitDate
クラスでは部分的な日付を定義できます。さらに、TimeZone
などのその他すべてのjava.util.Calendar
フィールドは、ExplicitDate
とともには定義されません。ExplicitDate
で時間部分が指定されない場合、Oracle Enterprise Schedulerにより適切な時間が算出されます。たとえば、2007年6月1日より後の毎週月曜日を示すスケジュールがあるとし、2007年8月17日(金曜日)の明示的な日付を追加するとします。この例では、2007年8月17日には時間が含まれていないため、これは部分的な日付です。
Oracle Enterprise Schedulerの除外を使用して、スケジュールから除外する必要がある日付を表すことができます。たとえば、除外を使用して、スケジュールでスキップする休日のリストを作成できます。
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);
除外のリストを作成して、除外日を維持するには、次を実行します:
ExclusionsDefinition
オブジェクトを定義します。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");
Oracle Enterprise Schedulerを使用してスケジュールを作成し、ジョブ・リクエストが実行されるタイミングを決定したり、他の目的にもスケジュールを使用できます(作業割当てがアクティブになるタイミングを決定するなど)。スケジュールには、2007年6月13日などの明示的な日付のリスト、または繰り返される日付や日付および時間を表す式のセットが含まれます。スケジュールでは、特定の除外および包含日付も指定できます。
次のものを使用してスケジュールを作成します。
明示的な日付: スケジュールまたは除外で使用する日付を定義します。詳細は、「明示的な日付の定義」を参照してください
繰返し: 繰り返される日付と時間のパターンを表す式を含めます。たとえば、毎週月曜日の10:00AMなど、定期的な時間を表す繰返しを指定できます。詳細は、「繰返しの定義」を参照してください
除外: スケジュールから除外する日付または日付と時間のリストを含めます。たとえば、除外を作成して、スケジュールから除外する休日のリストを含めることができます。詳細は、「除外の定義および格納」を参照してください
例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); } }
Fusion Middleware Controlを使用して、特定のスケジュールを使用するジョブ・リクエストを検索できます。
特定のスケジュールを使用するジョブ・リクエストの検索の詳細は、『Oracle Fusion Middleware Oracle Enterprise Schedulerの管理』の「Oracle Enterprise Schedulerリクエストの管理」、Oracle Enterprise Schedulerジョブ・リクエストの検索に関する項を参照してください。