タイマー コントロールを使用する

タイマー コントロールを操作するための IDE コマンド

タイマー コントロールを挿入するには、コード エディタを右クリックして [挿入|コントロール] を選択します。

TimerControlBean を使用してタイマー コントロールを挿入するには、次の手順に従います。

  1. コード エディタを右クリックして、[挿入|コントロール] を選択します。
  2. アノテーションを手動で編集して TimerControlTimerControlBean に変更します。
  3. アノテーション行の横にあるマーカー バーの問題マーカーを右クリックして [クイック・フィックス] を選択し、TimerControlBean に必要なインポートを行います。クイック・フィックスメニューを使用してTimerControlBeanに必要なインポートを行います。

[プロパティー] ビューにタイマー コントロール (またはタイマー コントロール Bean) のプロパティを表示するには、次の手順に従います。

  1. [J2EE] パースペクティブが開いていること (ワークベンチ上部のツールバーのすぐ下の表示) を確認します。もし開いていなければ、[ウィンドウ|パースペクティブを開く] をクリックして [J2EE] パースペクティブを開きます。
  2. タイマー コントロール (またはタイマー コントロール Bean) 名をダブルクリックします。[プロパティー] ビューにアノテーションのプロパティが表示されます。

[プロパティー] ビューに入力される時間文字列は検証されません。時間は実行時でのみ検証されます。

タイマー コントロールを使用する Web サービスの要件

タイマー コントロールは、会話形式で Serializable を実装する Web サービス内でのみ使用されます。詳細については、「会話形式の Web サービスの設計」を参照してください。

TimerControl アノテーション

タイマー コントロールのパラメータを設定するアノテーションについては、「TimerControl.TimerSettings annotation」を参照してください。

TimerControl インタフェース

以下のプロパティとメソッドの詳細については、「TimerControl インタフェース」を参照してください。

プロパティ

プロパティ ゲッター セッター 説明
running boolean boolean isRunning()   タイマーが現在実行中かどうかを調べる。
timeoutAt Date Date getTimeoutAt() void setTimeoutAt(Date arg0) 初期タイムアウト (絶対的な日付)。日付は java.util.Date。setTimeoutAt() を呼び出すと、既存の相対的なタイマーが指定された絶対時間に置き換えられる。過去の絶対的な日付に設定すると、すぐにコールバックが発生する。
payload Serializable Serializable getPayload() void setPayload(Serializable arg0) コールバックでイベント ハンドラに返される特別なデータ。ペイロードはシリアライズ可能なため、ペイロードを指定する場合、タイマー コールバックの発生時にオブジェクトがすでに存在していることを確認すること。

メソッド

TimerControl には、3 つのメソッドがあります。

メソッド 説明
void start()

タイマー オペレーションを開始する。タイマー コントロールは、timeout、timeoutSeconds、repeatsEvery、または repeatsEverySeconds 属性によって指定された時間が経過すると発動します。start() メソッドは、会話の START または CONTINUE のいずれかのフェーズで呼び出すことができます。

タイマーで 2 回 start() メソッドを呼び出しても効果はない。タイマーが停止した場合は、start() を呼び出すと、タイマーが再度開始する。

void stop()

再度発動しないようにタイマー コントロールを停止する。start() を呼び出すと、タイマーが再度開始します。stop() メソッドは、会話の FINISH または CONTINUE のいずれかのフェーズで呼び出すことができる。stop() メソッドは会話の終了時に必ず呼び出します。stop() メソッドが呼び出されない場合は、コンテナがタイマーを自動的に終了します。

stop() メソッドを呼び出してイベント タイマーが停止しても、例外は発生しない。また、タイマーで複数回 stop() メソッドを呼び出しても、例外は発生しない。

void restart() タイマー コントロールを停止して再開する。このメソッドは、タイマーが同じパラメータで再開するため、相対時間のタイムアウトまたは繰り返しの時間間隔で処理する場合にのみ有効です。

イベント

タイマー コントロールによって生成されるイベントは 1 つです。

イベント   説明
onTimeout void callback(long timeout, Serializable payload) タイマーが期限切れになったときに発生する。

TimerControlBean

TimerControlBean は、TimerControl インタフェースを実装し、以下の新しいメソッドとプロパティを提供します。

プロパティ

プロパティ ゲッター セッター 説明
coalesceEvents boolean boolean isTimerSettingCoalesceEvents() void setTimerSettingCoalesceEvents(boolean arg0) 繰り返しのイベントのために結合メソッドを使用するようにタイマー コントロールを設定するかどうか。
transactional boolean boolean isTimerSettingTransactional() void setTimerSettingTransactional(boolean arg0) タイマー コントロールが現在トランザクション モードで実行中かどうか。

メソッド

[プロパティー] ビューに表示されるプロパティ値を取得または設定するために、以下のメソッドが追加されています。

メソッド 説明
String getTimerSettingJNDIContextFactory() JNDI コンテキスト ファクトリを返す。
String getTimerSettingJNDIProviderURL() JNDI プロバイダ URL を返す。
String getTimerSettingRepeatsEvery() 繰り返しのタイマー設定における相対時間 (文字列) を返す。
Long getTimerSettingRepeatsEverySeconds() 繰り返しのタイマーの秒数を返す。
String getTimerSettingTimeout() タイムアウトの相対時間 (文字列) を返す。
Long getTimerSettingTimeoutSeconds() タイムアウトの秒数を返す。
void setTimerSettingJNDIContextFactory(String arg0) JNDI コンテキスト ファクトリを設定する。
void setTimerSettingJNDIProviderURL(String arg0) JNDI プロバイダ URL を設定する。
void setTimerSettingRepeatsEvery(String arg0) 相対時間 (文字列) を指定して繰り返しのタイマーを設定する。
void setTimerSettingRepeatsEverySeconds(Long arg0) 指定した秒数を繰り返しのタイマーに設定する。
void setTimerSettingTimeout(String arg0) 相対時間 (文字列) を相対時間のタイムアウトに設定する。
void setTimerSettingTimeoutSeconds(Long arg0) 指定した秒数を相対時間に設定する。

setTimerSettingxxx メソッドは、タイマーがすでに開始している場合には効果がありません。時間値を設定するには、タイマーを停止し、メソッドを呼び出して値を設定した後、タイマーを開始する必要があります。これは、新しいタイマー オブジェクトを作成するのではなく、既存のコントロールを再開するだけです。

repeatEverySecondrepeatEvery の両方が設定されている場合、エラーは発生せずに repeatEverySecond 値が使用されます。

timeouttimeoutSeconds の両方が設定されている場合、エラーは発生せずに timeoutSeconds 値が使用されます。

setTimeout または setTimeoutSeconds のメソッドで過去の絶対的な日付や負の時間値を設定すると、すぐにコールバックが発生します。

getTimerSettingxxx メソッドで、タイマーが実行中か停止中かを判別することができます。

以下は内部でのみ使用されるメソッドです。使用しないようにしてください。

内部でのみ使用されるメソッド
getCallbackListener
addCallbackListener
removeCallback
removeCallbackListener
getControlImplementation
setControlImplementation

イベント

TimerControlBean によって新たに生成されるイベントはありません。

相対時間および絶対時間の設定

相対時間の設定

相対時間値は、相対時間のタイムアウトと繰り返しの時間に使用されます。相対時間値は、[プロパティー] ビューを使用するか、TimerControlBean のメソッドを呼び出すことで設定します。

相対時間をテキスト文字列で指定すると、整数値の後に大文字と小文字を区別しない時間単位が付いた形式にフォーマットされます。時間単位は、スペースで区切ることができます。たとえば、以下のコード サンプルはすべての時間単位を省略しないで指定した有効な持続時間指定です。

@TimerControl.TimerSettings(timeout="99 years 11 months 13 days 23 hours 43 minutes 51 seconds") 
@Control()
Timer almostCentury;
  

この例では、約 100 年経過した後に初めて発動するタイマー コントロールを作成します。

時間単位には省略形を使用することができます。たとえば、「months」の有効な省略形は「month」、「mont」、「mon」、「mo」、および「m」です。月と分の両方を指定する場合は、どちらを表すのか区別できるような省略形を使用します。

テキスト文字列は、先頭が「p」(大文字と小文字を区別しない) で始まる ISO 8601 拡張フォーマットを使用することもできます。その場合、1 文字からなる省略形を使用し、スペースを入れないで、年、月、日、時、分、秒の順番で指定しなければなりません (http://www.w3.org/TR/xmlschema-2/#duration を参照)。

以下のタイマー コントロール宣言は上の例と同じですが、完全省略形を使用しています。

@TimerControl.TimerSettings(timeout="P99Y11Mo13D23H43M51S")
@Control()
Timer almostCentury;
  

持続時間はグレゴリオ歴のルールに従って計算されるので、今日が 17 日であれば、今日から 3 か月後もその月の 17 日になります。対象となる月が短く、対応する日が存在しない場合 (2 月 31 日など)、同じ月の直近の日 (うるう年の 2 月 29 日など) が該当します。

絶対時間の設定

タイマーが特定の時間 (絶対時間) に発動するように指定するには、setTimeoutAt メソッドを使用する必要があります。

絶対時間は、オペレーションを開始および終了する正確な時期が分かっている場合に役立ちます。たとえば、Web サービスに確認メールを送信させ、誰かの誕生日が近いことを通知するようアプリケーションで設定できます。java.util.Date オブジェクト (Java 1.5) で特定の時間を設定することができます。TimerSetting アノテーションでは java.util.Date フォーマットのタイムアウトを指定することはできないため、setTimeoutAt メソッドを使用する必要があります。詳細については、「TimerControlBean インタフェースのメソッドによるパラメータの設定」を参照してください。

下位互換性のための TimerControl のメソッド

TimerControl インタフェースには、WebLogic Workshop 8.1 アプリケーションとの下位互換性を維持するためのメソッド群が追加されています。ただし、これらのメソッドは推奨されていません。下位互換性のためのメソッドを以下に示します。

メソッド 説明
long getTimeout() 現在の相対時間のタイムアウト値を取得する。
String getRepeatsEvery() ISO 8601 フォーマット (Pxxx) の繰り返しの時間間隔を返す。
boolean getCoalesceEvents() 実行中のタイマーが結合モードなのか、非結合モードなのかを示す値を返す (非推奨)
void setCoalesceEvents(boolean coalesce) 結合モードに設定する。
void setRepeatsEvery(long seconds) 繰り返し時間 (秒) を繰り返しのタイマーに設定する。
void setRepeatsEvery(String interval) 指定した時間間隔 (文字列) を繰り返しのタイマーに設定する。
void setTimeout(String arg0) 相対時間 (文字列) を相対時間のタイムアウトに設定する。
void setTimeout(long seconds) 指定した秒数を相対時間に設定する。

WebLogic Workshop 8.1 では、すでに起動されているタイマーの start() メソッドを呼び出すと、新しいタイマー イベントを生成する可能性があります。Workshop 9.2、および 10 x では、すでに開始されているタイマー コントロールの start() を呼び出しても何の効果もありません。

注意事項と実装に関するメモ

ファイル weblogic_timer_control.jar には、タイマー コントロールの実装が含まれています。このファイルには、コントロールのインタフェースと実装、およびステートレス セッション Bean が定義されています。この JAR は、Web サービス プロジェクトの作成時に自動的にデプロイされます。

タイマー コントロール実装は、EJB 2.1 タイマー サービスを使用する com.bea.wlw.control.timer.EjbTimerControlImpl によって提供されます。コントロール Bean は、EJB ローカル インタフェースを使用して、ステートレス セッション Bean によるタイマーの作成と取り消しを委託します。タイマーが期限切れになると、セッション Bean の ejbTimeout メソッドが EJB コンテナによって呼び出されます。ejbTimeout メソッドは、タイマー作成時にタイマーで格納された ControlHandle を取得し、ControlHandle を使用してターゲットの TimerControl にコールバック イベントをディスパッチします。この実装は TimerControl が実行しているコンテナには依存しません。

タイマー コントロールは EJB 2.1 タイマー サービスをベースにしているため、要求に応じてクライアントにコールバックするために最善の努力をしますが、真のリアルタイム タイム サービスではありません。

 


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。