WriterはUnixにおける"write"アプリケーションをAgletにより実現したものです。これは2つのAgletで構成されています。ひとつはWriterで移動しないエージェントです。もう一方はWriterSlaveで移動するエージェントです。WriterSlaveはWriterによりリモートホストに送り出されそこでウィンドウを開きWriterからのメッセージを表示します。そのあとWriterSlaveはWriterへ戻りメッセージが受信されたことを知らせます。
のちほど述べます
2つ以上のAgletサーバーをネットワーク上で実行させます(Agletサーバーの実行方法についてはここをご覧ください)。
Tahitiの"new aglet"パネルでクラス名を"ibm.aglets.samples.Writer"と指定して Writer Agletを生成します(Agletの生成に関してのより詳細な情報はTahiti ユーザーガイドをご覧ください)。Writer Agletが生成されるとダイアログ・ウィンドウが開きます。
atp://aglets.trl.ibm.com
またAgletサーバーがデフォルトのポート番号(434)以外で動いているなら次のようになります。
atp://aglets.trl.ibm.com:500
WriterSlave Agletが目的のホストに到着すると、次のようなウィンドウがポップアップします。
ウィンドウにはメッセージの送り手の名前、ホスト名、メッセージが表示されています。ウィンドウはメッセージの受け手がQuitおよびThankというボタンを押さずにいても10秒で閉じられます。(ボタンを押せばその時点でウィンドウは閉じます)
WriterSlave Agletはマスター(Writer)のもとに帰ると、確認を表わす"Returned"という文字をWriter'のウィンドウのメッセージパネル(ウィンドウの下部にあります)に表示します。メッセージ・ウィンドウのThankボタンが押されたら、受信確認は"Returned: THANKS!!"という文字になります。
Agletのサンプルのトラブルシューティングに関してはここをお読み下さい。
このプログラムは以下のクラスで構成されています。
WriterクラスはSampleAglet抽象クラスを継承してステーショナリーなAgletとして作られます(SampleAglet 抽象クラスについてはここを参照してください)。Writer クラスのgoメソッドでスレーブAgletが作られます。
protected void go(URL url, Strin text) { ... AgletContext ac = null; String username = "Unknown"; try { ac=getAgletContext(); username = ac.getProperty("aglets.tahiti.user.name", "Unknown"); } catch ... Arguments args = new Arguments(); args.putArgument("msg",text); args.putArgument("user", username); try { Slave.create(null, "ibm.aglets.samples.WriterSlave", getAgletContext(), this, new SeqItinerary(url), args); } catch ... }
スレーブは単一の目的地を示す旅行計画(urlパラメータ)、メッセージテキスト(textパラメータ)、 そしてメッセージテキストと送り手のユーザー名を含むArgument object (argsパラメータ)を与えられます。 Writer Agletはスレーブのマスターと考えられます(Slave.create メソッドの中ではthisという引数で表わされています)。
Writer Agletはマスターとしてスレーブの結果を受け取ります (callbackメソッドで処理は行われます)、またスレーブが仕事を果たせなかったときにはエラーメッセージを受け取ります(inErrorメソッドで処理されます)。
protected synchronized void callback(Object obj) { if (obj != null) { try { setTheMessage((String)obj); // print on the message panel } catch (Exception e) { // not yet implemented } } }
callbackメソッドはオーバーライトされて次のような働きをします。結果(String object)を受け取り、(setTheMessageメソッドを経由して)ウィンドウの中のメッセージパネルに表示します。
WriterSlaveクラスはスレーブクラスの中の抽象メソッドを実装しています。 そのなかにinitializeJob()とdoJob()というメソッドがあります。.
private final int SHOW_TIME = 10
protected synchronized void doJob() throws AgletException { WriterSlaveWindow win = null; try { String from = new String ((String)(((Arguments)ARGUMENT).getArgument("user")) + "@" + getOrigin().getHost()); win = new WriterSlaveWindow(this, (String)(((Arguments)ARGUMENT).getArgument("msg")), // the message from); // the sender } catch (Exception e) { ... } wait(SHOW_TIME); win.dispose(); setResult("returned" + ((RESULT != null) ? ":" + (String)RESULT : ".")); // acknowledgment }
doJob()メソッドの中では、スレーブは新しいWriterSlaveWindowのインスタンスであるウィンドウをポップアップさせます(このクラスはWriterSlaveクラスのソースファイルの中に含まれています)。ウィンドウにはメッセージとその送り手の情報(ユーザー名とホスト名)が表示されます。 QuitもしくはThankボタンが押されなくとも、10秒たてばウィンドウは閉じられます。
Writer Agletについてより詳細な情報をお望みならソースコードをお読み下さい。