Aglets Workbench

To Aglets Workbench Home pageWatcherアプリケーション

解説

トラブルシューティング

プログラム解説

このプログラムは以下のクラスで構成されています。

Watcherクラス

WatcherクラスはSampleAglet抽象クラスを継承してステーショナリーなAgletとして作られます(SampleAglet 抽象クラスについてはここを参照してください)。Watcher クラスのgoメソッドでWatcherNotifier Agletが作られます。

   protected void go(URL destination, double interval, double duration, boolean stay, String path) {
      super.go(destination);
      try {
         Notifier.create(null, NotifierClassName, getAgletContext(), this,
            new SeqItinerary(destination), interval, duration, stay, path);
      } catch (IOException ae) {
         ......
      }
   }
}

WatcherNotifierは単一の目的地を示す旅行計画(destinationパラメータ)と監視したいローカルファイル名(pathパラメータ)を与えられます。 あとのパラメータはチェックする時間間隔、監視し続ける時間、それから最初の変更を見つけた後も監視を続けるかどうかです。時間の単位で指定します。 Watcher Agletはノーティファイアのマスターと考えられます(Notifier.create メソッドの中ではthisという引数で表わされています)。

SampleAgletにあるデフォルトのhandleMessageメソッドは完全にオーバーライトされ、報告するメッセージ以外のメッセージはまったく受け付けないようになってます。

   public boolean handleMessage(Message msg) {
     if ("notification".equals(msg.kind)) 
        message((Arguments)(msg.getArg()));
     else 
        super.handleMessage(msg);
     return true;
   }

報告メッセージはmessageというprivateなメソッドの中で扱われます。 受け取ったメッセージで(メッセージの中のtypeという変数を見れば)ファイルの更新があったのか、監視期間が終わったのか、それとも予期せぬエラーが起こったのかということがわかります。

   private synchronized void message(Arguments message) {
     int type = ((Integer)message.getArgument("type")).intValue();
     if (type == Notifier.NOTIFICATION) {
        _msw.appendResult(
              "UPDATE: " + (String)(message.getArgument("message")) +
              ", AT: " + message.getArgument("date").toString());
     } else {
        setTheMessage((String)(message.getArgument("message")));
     }
   }

WatcherNotifierクラス

WatcherNotifierクラスはNotifierクラスの中の抽象メソッドを実装しています。そのなかにinitializeCheck()doCheck()というメソッドがあります。 InitializeCheck()メソッドの中では、ノーティファイアーはファイルを見つけて最終更新時刻を記録しようとします(lastModifiedという変数です)。

   protected void initializeCheck() throws AgletException {
      _filePath = (String)ARGUMENT;
      setText("checking update of " + _filePath);
      if ((f = new File(_filePath)) == null) {
         throw new AgletException("Null File object error");
      }
      
      if (f.exists()) {
         _lastModified = f.lastModified();
         MESSAGE = _filePath;
         return;
      } else {
            throw new AgletException("Access Non-Existing File");
        }
   }

doCheck()メソッドの中では、ファイル更新を検出するのに現在の最終更新時刻と自分が知っている最終更新時刻(lastModified変数)とを比較します。 もし変化があれば、ファイル名をMESSAGE変数の中に記録します。そして最終的には報告メッセージとして送られます。

   protected boolean doCheck() throws AgletException {
      long time;
      
      if (f != null) {
         // get the timestamp of the target file
         time = f.lastModified();
         if (_lastModified != time) {
            MESSAGE = _filePath ;

            // update _lastModefied timestamp
            _lastModified = time;
            
            // file has changed on time "Date(time)"
            return true;
         }
      } else 
         throw new AgletException("Null File object error");
      
      // no change on the target file
      return false;
   }

ソースコード

Watcher Agletについてより詳細な情報をお望みならソースコードをお読み下さい。


IBM home page | 日本IBM | 著作権 | 商標
Last modified: Fri December 27 12:00:00 JST 1996