チュートリアル : タイマー コントロールの作成

この短いチュートリアルでは、タイマー コントロールを使用して Web サービスを作成およびテストします。

注意 : このチュートリアルでは、新しいワークスペースを作成する必要があります。ワークスペースをすでに開いている場合、IDE が再起動されます。開始する前に、この再起動による中断を回避するため、スタンドアロン モードでヘルプを起動し、このトピックを新しいブラウザで指定しておくことをお勧めします。詳細については、「スタンドアロン モードでのヘルプの使用」を参照してください。

このチュートリアルのタスクは以下のとおりです。

このチュートリアルでは、クライアントの Web サービスを 2 秒ごとにコールバックするタイマー コントロール (com.bea.control.TimerControl 基本クラスのインスタンス) の宣言とインスタンス化を行う Web サービスを作成します。この例では、以下の 2 つの Web サービス オペレーション (Web メソッド) を使用します。

コールバックを受信すると、サンプル プログラムによってコンソール ウィンドウにテキストが表示されるだけです。通常は、プログラムのロジックがコールバックのルーチン内に挿入されていて、適切なアクションを実行します。

WebLogic Server をコンフィグレーションする

この手順では、Workshop が使用する WebLogic Server ドメインを追加します。このサーバ ドメインには、アプリケーションで必要なランタイム ライブラリが含まれており、アプリケーションはこのサーバにデプロイされます。


Web サービスを作成する

タイマー コントロールは会話形式の (ステートレスではない) Web サービス内でのみ作成できます。このチュートリアルでの Web サービスの作成手順は、以下のとおりです。

  1. Workshop を起動して、空のワークスペースを新しく作成します。
  2. [ファイル|新規|プロジェクト] をクリックします。[Web サービス] を展開し、[Web サービス プロジェクト] をダブル クリックします。
  3. プロジェクト名を指定します。[Add project to an EAR] をクリックします (デフォルトでは、EAR プロジェクトの名前は、プロジェクト名の末尾に「EAR」を付加したものになります)。[終了] をクリックします。
  4. [プロジェクト エクスプローラ] ビューで、([Web サービス プロジェクト] フォルダにある) [Java リソース/src] フォルダを右クリックし、[新規|パッケージ] をクリックして、Web サービス用のパッケージを作成します。パッケージ名を指定して、[終了] をクリックします。
  5. [プロジェクト・エクスプローラー] ビューで新しいパッケージを右クリックし、[新規|WebLogic Web サービス] をクリックします。「TimerService」として Web サービス名を指定して [終了] をクリックします。Web サービス デザイナに、新しい空の Web サービスが表示されます。この Web サービスには、デフォルト メソッドが 1 つだけ含まれています。

Web サービスとタイマー コントロール アノテーションを設定する

この時点で、エディタ ペインの Web サービスのデザイン ビュー ([Designer] ペイン) には、Web サービスを格納したパッケージを含むプロジェクトが表示されています。

会話形式の Web サービスは java.io.Serializable インタフェースを実装する必要があります。このインタフェースを Web サービスに設定するには、次の手順に従います。

  1. Web サービスのソース ファイルを編集するため、デザイナを右クリックして [ソースの編集] を選択します。Web サービスのクラス定義の行に、以下のように implements Serializable を挿入します。
    public class TimerService implements Serializable {

    クラス宣言行のマーカー バーにエラー マーカーが表示されます。エラー マーカーを右クリックして、[クイック・フィックス] を選択します。

  2. [クイック・フィックス] プルダウンが表示されます。

    [Import 'Serializable' (java.io)] をクリックして〔Enter〕を押すと、新しい import 行が生成されてエラーが解決します。[ファイル|保存] を選択してファイルを保存します。

デフォルトでは、Web サービスを作成したときに hello() メソッドが挿入されています。このメソッドは不要なメソッドです。

  1. [TimerService.java [Designer]] タブをクリックします。hello() メソッドを右クリックして、[削除] を選択します。

    [はい] をクリックして削除を確認します。

タイマー コントロールを生成するには、次の手順に従います。

  1. Designer ペイン内を右クリックし、[新しいコントロール参照] をクリックします。
    [コントロールの選択] ダイアログで [タイマー コントロール] を選択し、[OK] をクリックします。
  2. [TimerService.java] タブをクリックし、以下のコードが挿入されていることを確認します。
    @Control
    private TimerControl timerControl;
  3. コントロール宣言 private TimerControl timerControl; 内の任意の箇所にカーソルを置きます。
  4. [プロパティー] ビューをクリックします。
  5. [プロパティー] ビューで、repeatsEverySeconds の場所を特定します。
    [repeatesEverySeconds] の [] カラムに、値 2 を入力して、〔Enter〕を押します。
  6. [ソース コード エディタ] ウィンドウでコントロールのアノテーションが以下のように更新されます。
    	@Control
    	@TimerControl.TimerSettings(repeatsEverySeconds=2)
    	private TimerControl timerControl;
         
  7. 〔Ctrl〕+〔S〕を押して作業を保存します。

2 秒ごとに Web サービスをコールバックする timerControl というタイマー コントロールが作成されました。次に、2 つの Web メソッド (タイマー コントロールを開始するメソッドと停止するメソッド) を定義します。

タイマーを開始する Web メソッドを定義するには、次の手順に従います。

  1. [TimerService.java [Designer]] タブをクリックし、[Designer] タブ内で右クリックし、[新しい Web メソッド] を選択します。

    エディタ内に新しいオペレーション (Web メソッド) が作成されます。その際、メソッドのデフォルト名が強調表示されます。
  2. このメソッドの名前を「start」とし、〔Enter〕を押します。

  3. start メソッドの名前を右クリックし、プルダウンから [会話の開始] を選択します。

  4. ここでソース コードを編集し、メソッド本体の return; 文を以下のように置き換えて、タイマーの start メソッドが呼び出されるようにします。
    timerControl.start();
    System.out.println("**************");
    System.out.println("Timer started");
    System.out.println("**************"); 

    Web メソッドは以下のようになります。

    @WebMethod
    @Conversation(Conversation.Phase.START)
    public void start()
    {
       timerControl.start();
       System.out.println("**************");
       System.out.println("Timer started");
       System.out.println("**************");
    }

タイマーを停止する Web メソッドを定義するには、次の手順に従います。

  1. 上記と同様の手順で、stop という名前の Web メソッドを挿入します。メソッド名を右クリックし、[会話の終了] を選択します。
  2. ソース コード エディタで、メソッド宣言を変更して String 値が返されるようにします。
  3. タイマー停止のメソッドを呼び出すため、メソッド本体の return; 文を以下のように置き換えます。
    timerControl.stop();
    System.out.println("**************");
    System.out.println("Timer stopped");
    System.out.println("**************");
    return "ok";
    Web メソッドは以下のようになります。
    @WebMethod
    @Conversation(Conversation.Phase.FINISH)
    public String stop()
    {
       timerControl.stop();
       System.out.println("**************");
       System.out.println("Timer stopped");
       System.out.println("**************");
       return "ok";
    }

定義した時間が経過したことをタイマー コントロールが通知したときに反応するイベント ハンドラを追加するには、次の手順に従います。

  1. [Designer] ペインまたはソース コード ペインを右クリックし、[挿入|コントロール イベント ハンドラ] を選択します。

    [イベント ハンドラの挿入] ダイアログで、[timerControl] をクリックして [OK] をクリックします。
  2. ソース コード ペインで、以下の行をイベント ハンドラの本体に挿入します。
    System.out.println("***********************************");
    System.out.println("Callback received from timer firing");
    System.out.println("***********************************");
    

    イベント ハンドラは以下のようになります。

    @EventHandler(field="timerControl", eventSet=TimerControl.Callback.class, eventName="onTimeout")        
    protected void timerControl_Callback_onTimeout(long p0, Serializable p1) {
    {    System.out.println("***********************************");    System.out.println("Callback received from timer firing");    System.out.println("***********************************"); }
  3. [ファイル|保管] コマンドで変更をすべて保存します。

ここまでで、以下の内容を含む Web サービスが作成されました。

Web サービスのソースは、以下のようになっているはずです。

package timer;

import java.io.Serializable;

import javax.jws.*;
import org.apache.beehive.controls.api.bean.Control;
import com.bea.control.TimerControl;
import weblogic.jws.Conversation;
import org.apache.beehive.controls.api.events.EventHandler;

@WebService
public class TimerService implements Serializable{
	
  @Control
  @TimerControl.TimerSettings(repeatsEverySeconds=2)
  private TimerControl timerControl;
  private static final long serialVersionUID = 1L;
  @WebMethod   @Conversation(Conversation.Phase.START)   public void start() { timerControl.start();  System.out.println("**************"); System.out.println("Timer started"); System.out.println("**************");   }   @WebMethod   @Conversation(Conversation.Phase.FINISH)   public String stop() { timerControl.stop(); System.out.println("**************");      System.out.println("Timer stopped"); System.out.println("**************"); return "ok";   }   @EventHandler(field = "timerControl", eventSet = TimerControl.Callback.class, eventName = "onTimeout")   protected void timerControl_Callback_onTimeout(long p0, Serializable p1) { System.out.println("***********************************"); System.out.println("Callback received from timer firing"); System.out.println("***********************************");  } }

Web サービスとタイマー コントロールをテストする

Web サービスとタイマー コントロールをテストするには、次の手順に従います。

  1. エディタ ペインを右クリックして、[実行|サーバで実行] を選択します。
  2. [サーバで実行] ダイアログで [終了] をクリックします。
  3. WebLogic のテスト クライアントがエディタ ウィンドウのタブ内で実行されます。

  4. [start] ボタンをクリックして、start オペレーションを呼び出します。start オペレーションから返された結果が表示されます。

  5. 開始内容とコールバックの結果を確認するには、WebLogic Server コンソール ウィンドウ (ヘッダ バーが「WebLogic Server - 10.0」である [コマンド プロンプト] ウィンドウ) に切り替えます。コンソール ウィンドウは、デフォルトでは、ステータス バーにアイコン化されています。コンソール ウィンドウを開くと、以下のメッセージが表示されており、タイマーが開始しているのが確認できます。

    **************
    Timer started
    **************
    これは、start オペレーションによって生成されます。2 秒ごとにタイマーが発動するため、このメッセージはすぐにスクロールされてしまいます。

    次に、コンソール ウィンドウにタイマーが発動していることが表示されます。タイマーが発動するごとに、以下のようなステータス情報のブロックが表示されます。

    ***********************************
    Callback received from timer firing
    ***********************************
          

    これは、2 秒ごとのタイマーの発動時にコールバックを受信するイベント ハンドラによって生成されます。

  6. タイマーの発動を停止するには、[テスト クライアント] ウィンドウ本体の [start Request Summary] のすぐ上にある [Continue this conversation] リンクをクリックします。次に、会話の次のフェーズのオペレーション (この例では stop オペレーション) が表示されます。

  7. [stop] をクリックします。[Test Client] ウィンドウに、stop オペレーションの結果が表示されます。

    2 秒ごとのタイマー発動を示すメッセージがコンソール ウィンドウに表示されなくなり、以下の行が表示されます。

    **************
    Timer stopped
    **************

    これで、stop オペレーションが成功しました。

関連トピック

チュートリアル : Workshop 入門

WebLogic システム コントロールの使用

タイマー コントロール

TimerControl インタフェース

タイマー コントロール リファレンス

チュートリアル : タイマー コントロールの作成

 


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