FingerはUnixにおける"finger"アプリケーションをAgletにより実現したものです。これらは2つのAgletで構成されています。ひとつはWriterであり移動しないエージェントです。他方はWriterSlaveといい移動するエージェントです。FingerSlaveはFingerによりリモートホストに送り出され、行き先でローカルユーザの情報を集めます。情報を集め終わると、FingerSlaveはFingerに戻りその情報を渡します。
のちほど述べます
2つ以上のAgletサーバーをネットワーク上で実行します(Agletサーバーの実行方法については、 ここ をご覧ください)。
Tahitiの"new aglet"パネルでクラス名を"ibm.aglets.samples.Finger"と指定してFinger Agletを生成します(Agletの生成に関してのより詳細な情報はTahiti ユーザガイドをご覧ください)。Finger Agletが生成されるとダイアログ・ウィンドウが開きます。
atp://aglets.trl.ibm.com
またAgletサーバーがデフォルトのポート番号(434)以外に設定されている場合は次のように指定します。
atp://aglets.trl.ibm.com:500
以下のような情報が手に入り、ダイアログ・ウィンドウの真中に表示されます(上に示したダイアログ・ウィンドウに例が出ています)。
Agletのサンプルのトラブルシューティングに関してはここをお読み下さい。
このプログラムは以下のクラスで構成されています。
FingerクラスはSampleAglet抽象クラスを継承してステーショナリーなAgletとして作られます(SampleAglet 抽象クラスについてはここ)を参照してください)。Finger クラスのgoメソッドでスレーブAgletが作られます。
private static final String SlaveClassName = "ibm.aglets.samples.FingerSlave"; protected void go(URL url) { super.go(url); try { Slave.create(null, SlaveClassName, getAgletContext(), this, new SeqItinerary(url), new String()); } catch (IOException ae) { ..... } }
スレーブは単一の目的地を示す旅行計画(urlパラメータ)を与えられます。 Finger Agletはスレーブのマスターと考えられます(Slave.create メソッドの中ではthisという引数で表わされています)。
Finger Agletはマスターとしてスレーブの結果を受け取ります (callbackメソッドで処理は行われます)、またスレーブが仕事を果たせなかったときにはエラーメッセージを受け取ります(inErrorメソッドで処理されます)。
protected synchronized void callback(Object arg) { setTheMessage("Finished"); if (arg != null) _msw.setResult( ((FingerInfo)arg).toTextBlock()); }
callbackメソッドはオーバーライトされて次のような働きをします。結果(FingerInfoオブジェクト)を受け取り、(toTextBlockメソッドを経由して)テキスト文字列に変換し、(setResultメソッドを経由して)ウィンドウの中のメッセージパネルに表示します。
FingerSlaveクラスはスレーブクラスの中の抽象メソッドを実装しています。そのなかにinitializeJob()とdoJob()というメソッドがあります。
protected synchronized void doJob() throws AgletException { RESULT = getLocalInfo(); } private Object getLocalInfo() throws AgletException { AgletContext ac = getAgletContext(); String hostname; // compute hostname FingerInfo info = new FingerInfo (hostname, (String)ac.getProperty("aglets.tahiti.user.name", "Unknown"), (String)ac.getProperty("aglets.tahiti.user.organization", "Unknown"), (String)ac.getProperty("aglets.tahiti.user.email", "Unknown"), (String)ac.getProperty("aglets.tahiti.registered", "Unknown"), (new Date()) ); return info; }
doJob()メソッドの中では、スレーブはそこでのユーザー情報を(Agletサーバーのプロパティから)引き出し、 FingerInfoオブジェクトの形に情報を加工します。そしてそのオブジェクトをスレーブの実行結果であるインスタンス変数とします(これは最終的にはマスターに送られます)。
Finger Agletについてより詳細な情報をお望みならソースコードをお読み下さい。