20.3.5 TimerManagerを使用したアプリケーションの開発
ここでは,TimerManagerを使用したアプリケーションの開発について説明します。
TimerManagerを使用する場合の,アプリケーションを構成するコンポーネントの使用可否を次の表に示します。
|
コンポーネント |
使用可否 |
|||
|---|---|---|---|---|
|
EJBクライアント |
× |
|||
|
リソースアダプタ |
× |
|||
|
JavaBeansリソース |
× |
|||
|
サーブレット/JSP※ |
○ |
|||
|
EJB |
Stateless Session Bean |
EJB2.1以前 |
CMT |
○ |
|
BMT |
○ |
|||
|
EJB3.0 |
× |
|||
|
Stateful Session Bean |
× |
|||
|
Entity Bean |
× |
|||
|
Message-driven Bean |
× |
|||
- (凡例)
-
○:使用できる
×:使用できない
注※ サーブレットリスナやフィルタでも使用できます。
TimerManagerを使用するアプリケーションの開発の流れは次のとおりです。
-
スケジュール元となるEJBまたはサーブレットの属性を定義する
-
TimerManagerのリスナに実行する処理を実装する
-
スケジュール元となるEJBまたはサーブレットを作成する
-
TimerManagerを使用するJ2EEアプリケーションをコンパイルする
それぞれの作業の詳細を次に示します。
- 〈この項の構成〉
(1) スケジュール元となるEJBまたはサーブレットの属性を定義する
TimerManagerを使用するEJBまたはサーブレットの属性をDDに定義します。TimerManagerを使用するための定義は,アノテーションでは実施できません。
TimerManagerを使用するために定義する必要がある属性を次の表に示します。
|
タグ名 |
説明 |
|
|---|---|---|
|
<ルートタグ> |
− |
|
|
┣ ┃ ┃ |
<description> |
任意で設定してください。 |
|
┣ ┃ ┃ ┃ |
<res-ref-name> |
JNDI ENC名(JNDIルックアップに使用する名前)を指定してください。 |
|
┣ ┃ ┃ ┃ |
<res-type> |
次の内容を設定してください。 「commonj.timers.TimerManager」 |
|
┣ ┃ ┃ |
<res-auth> |
設定した値は無視されます。 |
|
┣ ┃ ┃ ┃ ┃ |
<res-sharing-scope> |
「Unshareable」を設定してください。ただし,「Shareable」を設定しても,「Unshareable」設定時と同様に動作します(ルックアップされるたびに新しいTimerManagerが作成されます)。 |
|
┣ ┃ ┃ |
<mapped-name> |
設定した値は無視されます。 |
|
┣ ┃ ┃ |
<injection-target> |
設定した値は無視されます。 |
|
┗ |
<linked-to> |
設定した値は無視されます。 |
サーブレットでTimerManagerを使用する場合のweb.xmlの定義例を次に示します。
<web-app>
<display-name>TimerManagerSample</display-name>
<servlet>
<servlet-name>SampleServlet</servlet-name>
<display-name>SampleServlet</display-name>
<servlet-class>SampleServlet</servlet-class>
</servlet>
・・・
<resource-ref>
<res-ref-name>timer/MyTimer</res-ref-name>
<res-type>commonj.timers.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
</web-app>TimerManagerは,アプリケーション中でJNDIによるルックアップが実行されるたびに作成されます。作成されたTimerManagerは,stopメソッドの実行時,またはアプリケーション終了時に破棄されます。なお,TimerManagerは必要に応じて複数定義することもできます。
(2) TimerManagerのリスナに実行する処理を実装する
TimerManagerを使用するには,実行する処理を実装したリスナを作成する必要があります。リスナのインタフェースには,必ず実装するものと,必要に応じて実装するものがあります。必ず実装するインタフェースと必要に応じて実装するインタフェースを次に示します。
- 必ず実装するインタフェース
-
-
TimerListener
-
- 必要に応じて実装するインタフェース
-
-
StopTimerListener
-
CancelTimerListener
-
APIの詳細については,Timer and Work Manager for Application ServersのAPIの仕様を参照してください。
TimerListener,StopTimerListenerおよびCancelTimerListenerを実装したクラスの例を次に示します。
public class MyTimerListener
implements TimerListener,StopTimerListener, CancelTimerListener {
private int count = 0;
public MyTimerListener() {
}
public void timerStop(Timer timer) {
System.out.println("Timer stopped: " + timer);
}
public void timerCancel(Timer timer) {
System.out.println("Timer cancelled: " + timer);
}
public void timerExpired(Timer timer) {
System.out.println("Timer expired !");
if(count++ > 10) {
//規定回数に到達したためキャンセル
timer.cancel();
} else {
System.out.println("The next timer will fire at : " +
timer.getScheduledExecutionTime());
}
}
}
(3) スケジュール元となるEJBまたはサーブレットを作成する
TimerManagerを使用するには,スケジュール元となるEJBまたはサーブレットに,属性に定義したTimerManagerのJNDI名のルックアップ,およびTimerManagerの処理のスケジューリングを実装します。
- 属性に定義したTimerManagerのJNDIを使用したルックアップ
-
属性に定義したTimerManagerのJNDI名をルックアップしてTimerManagerを取得します。ルックアップにはjava:comp/envを使用します。TimerManagerを取得する例を次に示します。
InitialContext ic = new InitialContext(); TimerManager tm = (TimerManager)ic.lookup ("java:comp/env/timer/MyTimer"); - TimerManagerの処理のスケジューリング
-
TimerManagerの処理のスケジューリングは,TimerManagerのscheduleメソッドを呼び出して実行します。TimerManager処理のスケジューリングの例を次に示します。
InitialContext ctx = new InitialContext(); TimerManager mgr = (TimerManager) ctx.lookup("java:comp/env/timer/MyTimer"); TimerListener listener = new MyTimerListener(); mgr.schedule(listener, 1000*60,1000*10); mgr.stop();
(4) TimerManagerを使用するJ2EEアプリケーションをコンパイルする
TimerManagerを使用するJ2EEアプリケーションをコンパイルする場合は,次のJARファイルを含めてください。
<Application Serverのインストールディレクトリ>\CC\lib\ejbserver.jar