21.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