Cosminexus V9 アプリケーションサーバ 機能解説 拡張編

[目次][用語][索引][前へ][次へ]

10.3.5 TimerManagerを使用したアプリケーションの開発

ここでは,TimerManagerを使用したアプリケーションの開発について説明します。

TimerManagerを使用する場合の,アプリケーションを構成するコンポーネントの使用可否を次の表に示します。

表10-12 TimerManagerを使用する場合のアプリケーションを構成するコンポーネントの使用可否

コンポーネント 使用可否
EJBクライアント ×
リソースアダプタ ×
JavaBeansリソース ×
サーブレット/JSP
EJB Stateless Session Bean EJB2.1以前 CMT
BMT
EJB3.0 ×
Stateful Session Bean ×
Entity Bean ×
Message-driven Bean ×

(凡例)
○:使用できる
×:使用できない

注※ サーブレットリスナやフィルタでも使用できます。


TimerManagerを使用するアプリケーションの開発の流れは次のとおりです。

  1. スケジュール元となるEJBまたはサーブレットの属性を定義する
  2. TimerManagerのリスナに実行する処理を実装する
  3. スケジュール元となるEJBまたはサーブレットを作成する
  4. TimerManagerを使用するJ2EEアプリケーションをコンパイルする

それぞれの作業の詳細を次に示します。

<この項の構成>
(1) スケジュール元となるEJBまたはサーブレットの属性を定義する
(2) TimerManagerのリスナに実行する処理を実装する
(3) スケジュール元となるEJBまたはサーブレットを作成する
(4) TimerManagerを使用するJ2EEアプリケーションをコンパイルする

(1) スケジュール元となるEJBまたはサーブレットの属性を定義する

TimerManagerを使用するEJBまたはサーブレットの属性をDDに定義します。TimerManagerを使用するための定義は,アノテーションでは実施できません。

TimerManagerを使用するために定義する必要がある属性を次の表に示します。

表10-13 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