このモーバイルエージェントシステムでは、エージェントが別のエージェントの変数やメソッドを直接呼び出すことはできないようになっています。これは他のエージェントによる(不正な)呼び出しから守るためです。エージェント間で情報を交換する必要があるときには次の通信用のプリミティブを利用して通信をして下さい。また、これらのプリミティブを通じて通常のメソッド呼び出しと比較して、柔軟で並列性を活かした通信を実現することができます。通信の方式には、同期メソッド呼び出し、非同期メソッド呼び出し、一方向の非同期メッセージ送信の3種類があります。
エージェント間通信におけるメッセージは、Messageクラスのインスタンスとして実現されます。インスタンスの作成では下記のようにメッセージの名前を引数として与えます。メッセージの名前は文字列型の定数でなければなりません。また、大小文字を区別します。
Message(String name);
メッセージの引数は setArg() により設定します。
void setArg(Object obj);
ここで setArg() の引数が通信メッセージの引数となります。引数は0個以上を設定することができ、さらに型に制限はありません。ただし、 引数にはいるオブジェクトはJava のCore API に含まれるクラスからのインスタンスでなければいけません。
受信側では、メッセージ名と一致するメソッドに対して、setArg() で設定した順番の引数列として渡されます。このため、受信側のエージェントに送信メッセージと同じ名前のメソッドがあり、さらにそれの引数の数とそれらの型がその順番を含めて一致する必要があります。
Message msg = new Message("greeting"); msg.setArg("Hello"); msg.setArg("World");
この例は、greeting という名前のメッセージを生成するもので、その引数は、文字列型定数の "Hello" と "World" となります。なお、メソッド名がない場合や引数が一致しない場合は、ランタイムエラーとなります。
エージェント通信用のAPIにはタイムアウト機能をもつものがあります。これらを利用する場合はsetTimeout(int timelimit)を利用してタイムアウト時間を設定します。これは通信用APIを実行してから、通信相手で対応するメソッドの実行が終了するまでに許される時間間隔であり、その時間となるとタイムアウト例外となります。なお、setTimeout(int timelimit)を利用しない場合は時間制限は付かず、永遠に待つこともできます。
Message msg = new Message("greeting"); msg.setArg("Hello"); msg.setArg("World"); msg.setTimeout(1000);
この例は、greeting という名前のメソッドを引数"Hello" と "World"とともに呼び出し、ただし、通信修了までに1000ミリ秒以上時間がかかる場合は例外となります。