![]() ![]() ![]() ![]() |
注意 : | WLI タイマー コントロールは、WebLogic Integration の使用許諾を受けた場合にのみ、BEA WorkSpace Studio で使用できます。 |
タイマー コントロールは、指定した時間が経過したとき、または指定した絶対時間になったときにアプリケーションに通知します。
トランザクションとイベントには、完了するまでにある程度の時間を必要とするものがあります。また、中止しないと無限に実行を継続して、リソースを大量に消費するものもあります。また、特定の時刻に実行する必要のあるものもあります。タイマー コントロールを使用すると、指定した時間間隔が経過したとき、または指定した絶対時間に達したときに、コードで応答することができます。
ここでは、新しい WLI タイマー コントロールを作成する方法について説明します。
WLI タイマー コントロールを作成するには、次の手順に従います。
注意 : | [データ パレット] ビューが BEA Workshop for WebLogic Platform に表示されない場合は、メニュー バーから [ウィンドウ|ビューの表示|データ パレット] をクリックします。 |
タイマー コントロールは、指定した時間が経過したとき、または指定した絶対時間になったときにアプリケーションに通知します。タイマー コントロールを使用すると、たとえばプロセスを一日中一定の間隔で実行したり、あまりに長い時間がかかっている操作をキャンセルしたりできます。
次の節では、タイマー コントロールのコンフィグレーション方法について説明します。
デザイン ビューでのタイマー コントロールの動作を指定するには、[プロパティー] ペインでコントロールの timeout および repeatsEvery プロパティを設定します。図 18-1 に示すように、タイマー コントロール インスタンスにはさまざまなアノテーションが表示されます。
これらのアノテーションは、コード内でタイマー コントロールを識別する com.bea.control.WliTimerControl.TimerSettings
の属性に対応しています。com.bea.control.WliTimerControl.TimerSettings
には、以下の属性があります。
coalesceEvents
- イベントの配信が遅延した場合のタイマー コントロールの動作を指定します。jndiContextFactory
- JNDI コンテキスト ファクトリ クラスを指定します。jndiProviderURL
- JNDI プロバイダ URL を指定します。 repeatsEvery
- タイマー コントロールが初回作動時以降に作動する間隔を指定します。 repeatsEverySeconds
- タイマー コントロールが起動してから初めて作動するまでの時間を秒単位で指定します (デフォルトは 0)。timeout
- タイマー コントロールが起動してから初めて作動するまでの時間を秒単位で指定します。デフォルトは 0
秒です。timeoutSeconds
- タイマー コントロールが起動してから初めて作動するまでの時間を秒単位で指定します。デフォルト値は 0
です。 transaction
- タイマーがトランザクションに参加するかどうかを指定します。デフォルト値は true
です。
これらの属性は、相対時間で設定できます。相対時間とは、現時点からの相対的な時間間隔で、たとえば「今から 3 時間」のように設定します。また、タイマー コントロールの setTimeoutAt メソッドを呼び出して、タイマー コントロールの作動時間を「午前 3 時」のような絶対時間で指定することもできます。詳細については、WLiTimerControl インタフェースを参照してください。
ここでは、タイマー コントロールの相対時間値と絶対時間値を指定する方法について説明します。相対時間値は、現時点からの相対的な時間間隔を表します。たとえば、「次の火曜日」、「今から 20 分」のように指定します。絶対時間値は時刻を表します。たとえば、「午後 5 時」は絶対時間です。
現時点からの相対的な時間にイベントを作動させたい場合は相対時間を指定します。たとえば、別のシステムが応答するまでの待機時間を 5 分にしたいとします。その場合は、アプリケーションで相対時間 5 分のタイマーを設定して起動します。システムが応答する前にタイマーが期限切れになる (つまり、タイマーのコールバックが呼び出される) と、Web サービスは待機を中止して他のオペレーションを続行します。
タイマーを一定の間隔で作動させたい場合は、WLI タイマー コントロールの timeout 属性と一緒に、オプションの repeatsEvery 属性も指定します。これらの属性は、[プロパティ] ペインかソース コードで設定できます。また、TimerControl インタフェースの setTimeout メソッドや setRepeatsEvery メソッドを呼び出して設定することもできます。
相対時間を文字列として表現する場合は、時間を表す整数の後ろに時間単位を付加します。時間単位の大文字小文字は区別されません。これらの時間単位を区切るにはスペースを使用します。たとえば、次のサンプル コードは、すべての時間単位をフルスペルで指定した有効な期間です。
/**
* org.apache.beehive.controls.api.bean.Control
* com.bea.control.WliTimerControl.TimerSettings ="99 years 11 months 13 days 23 hours 43 minutes 51 seconds"
*/
Timer almostCentury;
このサンプルでは、デフォルトではほぼ 100 年後に初めて作動するタイマー コントロールを作成しています。
時間単位の表記は短縮できます。たとえば、「months」の短縮形として使用できるのは、「month」、「mont」、「mon」、「mo」、および「m」です。months と minutes の両方を指定する場合は、両者を区分できる長さの短縮形を使用してください。
文字列の先頭に、「p」を付けることもできます。この文字も、大文字小文字は区別されません。これを指定した場合は、すべての時間単位に 1 文字の短縮形を使用し、スペースを挿入することなく y、m、d、h、m、s の順に指定しなければなりません。
次に示すタイマー コントロールの宣言では、完全な短縮を使用して、上に示したサンプルと同じ時間を表しています。
/*
* @control
* @timer timeout="P99Y11Mo13D23H43M51S"
*/
Timer almostCentury;
期間は、グレゴリオ暦に基づいて計算されます。したがって、今日がある月の 17 日であれば、今日から 3 ヵ月後もその月の 17 日になります。たとえば 2 月 31 日のように、該当月の日数が少なく対応する日が存在しない場合は、同じ月の最も近い日 (うるう年であれば 2 月 29 日) が使用されます。
絶対時間は、オペレーションを特定の時刻に開始または終了したい場合に使用します。たとえば、友人の誕生日を忘れないようにするため、誕生日が近づいたら Web サービスからの電子メールで通知するアプリケーションを作成できます。
タイマー コントロールが絶対時間で作動するようにコンフィグレーションするには、TimerControl
インタフェースの setTimeoutAt メソッドを呼び出します。
setTimeoutAt
メソッドでは、指定した絶対時間が経過し次第、できる限り早くイベントが作動するようにタイマーをコンフィグレーションできます。過去の絶対時間を指定すると、タイマーはその時点からできる限り早く作動します。
setTimeoutAt
メソッドがトランザクション内で呼び出された場合、そのトランザクションがロールバックされると、setTimeoutAt メソッドの効果 (コールバック ハンドラ内で実行されたすべての作業) もロールバックされます。つまり、トランザクションがコミットされた場合に限り、setTimeoutAt メソッドの効果もコミットされます。
タイマーの実行中に setTimeoutAt
が呼び出されても、タイマーが停止して再起動されるまでは有効になりません。
setTimeoutAt
メソッドは、引数として java.util.Date
オブジェクトを取ります。その他の日付関連の Java クラスとしては、java.util.GregorianCalendar
と java.text.SimpleDateFormat
が使用できます。
getTimeoutAt
メソッドは、repeatsEvery 属性がゼロより大きい値に設定されている場合に、タイマーの次回の作動予定時刻を返します。repeatsEvery 属性がゼロに設定されている場合、getTimeoutAt
メソッドは、setTimeoutAt
メソッドによって設定された値、または timeout 属性に設定されている値を返します。getTimeoutAt
メソッドを onTimeout コールバック ハンドラ内から呼び出すと、初回のタイムアウトはすでに作動しているため、getTimeoutAt
からは次回のタイムアウトが返されるか、タイマーが繰り返し作動するように設定されていない場合は初回のタイムアウトの時刻が返されます。
次のサンプルでは、setTimeoutAt メソッドを呼び出して初回のタイムアウトが 30 秒後に作動するように設定し、setRepeatsEvery メソッドを呼び出してその後 60 秒ごとにタイマーが作動するように指定しています。onTimeout イベントでは、タイマー コントロールの作動に関する情報が提供されます。
/**
* @common:operation
* @jws:conversation phase="start"
*/
public void StartTimer()
{
Calendar cd = new GregorianCalendar();
cd.set(cd.SECOND, 30);
tTimer.setTimeoutAt(cd.getTime());
tTimer.setRepeatsEvery(60);
tTimer.start();
}
public void tTimer_onTimeout(long time)
{
callback.FireTimeout("The timer was scheduled to fire at: " + new Date(time)
+ ". The current time is: " + new Date()
+ ". The timer will fire again at: " + tTimer.getTimeoutAt());
}
![]() ![]() ![]() |