エージェントコールバックメソッド

佐藤一郎 1997/11/4

エージェントクラス

このモーバイルエージェントシステムでは、モーバイルエージェントのプログラムは、一つまたは複数のJavaのクラスから構成されます。ただし、そのうち一つ以上のクラスはクラス Agentを親クラスとして継承する必要があり、さらにそのうち一つは後述のエージェンランタイムからのコールバック呼び出しをうけるクラスとして指定する必要があります(このクラスをブートクラスと呼びます)。なお、以降ではエージェントを定義するためのクラスをエージェントクラス、そのインスタンスを単にエージェントと呼びます。

以下は SimpleAgent という名前のエージェントクラスの例です。 

public class SimpleAgent extends Agent {
	public SimpleAgent() {
		/* クラスのコンストラクタ */
	}
	.....
}

エージェントクラス(ブートクラス)に含まれる、変数、メソッド名や種類には特に決まりはありませんが、生成、消滅、移動、到着などの状態変化した際に呼び出されるコールバックメッソドは予め決まっています。それらをエージェントクラスに与えることにより、状態変化に際して、エージェントに適切な動作をさせることができます。また、エージェント自信が、複製、消滅、移動、通信などを実現する際には、対応するAPIを呼び出すことによって実現されます。

注意

エージェントクラスのコンストラクター及びメソッドにおいてスレッドを作成すべきではありません。作成してもエージェントが移動または永続化、複製する際にスレッドは破棄されます。 このため、スレッドを作成したときは移動、永続化、複製をする前にスレッドを停止して下さい。

エージェントクラス(ブートクラス)のコンストラクターには引数を入れてはいけません。また、現在のシステムでは構いませんが、コンストラクターの中身も空にしておくことを推奨します。これは将来のSunのJavaBenaとの融合の準備のためです。

Agentクラスはその親クラスとしてFrameクラスをもっています。このため、Appletクラスと同様にグラフィックルーチンを記述することができます。

エージェントのコールバックメソッド

エージェントが、生成、消滅、移動、到着、保存、復活、複製するときにエージェンランタイムから呼び出されるメソッド(コールバックメソッド)であり、次のようなものがあります。これらのメソッドは、エージェントの親クラスであるAgentで定義されています。このため、状態変化に対応した動作が必要なければユーザエージェントのブートクラスでオーバーライト必要はありません。ユーザエージェント側でオーバーライトしない場合はAgentクラスにある対応したメソッドが代わりに呼び出されます。逆に、作成しているエージェントでこれらのメソッドをオーバーライトすればブートクラスにあたえたメソッドが代わりに呼び出されす。

エージェントの状態遷移図

上図はエージェントの状態遷移とコールバックメソッドの関係を示したものです。エージェントは生成直後に初期化コールバックメソッドinit()を呼び出されます。そして、次にエージェント生成時の処理を行うコールバックメソッドcreate()が呼びされます。その後の状態においてエージェントはメッセージを受け取ることができるようになります。また、この状態において移動、永続化、停止の動作も可能になります。

コールバックメッソド

メソッド名

引数の数

引数の型

メソッド返値の型

init()

0

void

create()

0

void

dispatch()

1

URL

void

arrive()

0

void

destroy()

0

void

duplicate()

0

void

child()

1

AgentIdentifier

void

parent()

1

AgentIdentifier

void

suspend()

0

void

suspend()

1

String

void

初期化

void init() {
	/* do something */
}

クラスファイルからエージェントのファイルを合成するときに一度だけ呼び出されます。エージェントの初期設定などを行うことができますが、後述のエージェントコンテキストなどは使用できません。

生成

void create() {
	/* do something */
}

エージェントが生成される際に一度だけ呼び出されます。エージェントの初期設定などを行うプログラムを書くとよいでしょう。また、ウィンドウの表示を含むエージェントでは、create()の中で表示するようにすべきです。

終了

void destroy() {
	/* do something */
}
 

エージェントが、消滅する直前に呼び出されます。エージェントの終了時の後処理などをここに書くとよいでしょう。ウィンドウの表示を含むエージェントではウィンドウなどを消す処理をここに加えるべきです。

移動

void dispatch(URL url) {
	/* do something */
}

エージェントが、他のコンピュータに移動するときに、今いるコンピュータを離れる直前に呼び出されます。引数 url には移動先のURLアドレスが入ります。エージェントの移動ではエージェントの実行状態をJava の Serialization 機能を使って直列化、つまりバイト列に変換します。このため、エージェントが直列化不可能なオブジェクトが参照しているときは、移動する前にその参照を禁止する必要があります。このため、このメソッド内で直列化不可能なオブジェクトの参照がないようにする必要があります。このほか、ウィンドウの表示を含むエージェントではウィンドウなどを消す処理をこのメソッドに加えるべきです。

到着

void arrive() {
	/* do something */
}
 

エージェントが、移動先のコンピュータに到着した直後に呼び出されます。現在は引数がありませんが、将来arrive(url)に変更する予定です。

永続化

void suspend() {
	/* do something */
}
 

エージェントが永続化される直前に呼び出されます。ランライムはsuspend()を呼び出した後に、エージェントのプログラムコードとコンテキスト(状態)を2次記憶上のファイルにします。suspend()の実行を終えると、つぎにresume()が呼び出されるまでエージェントは動作が休止状態になります。

活性化

void resume() {
	/* do something */
}

永続化されたエージェントの再び動作可能になる際に呼び出されます。なお、休止状態から復活したエージェントは識別子が変わります。

複製

void duplicate() {
	/* do something */
}

これはエージェントの複製が生成される直前に呼び出されます。エージェントの複製では移動や永続化と同様にエージェントの実行状態を直列化します。このため、エージェントが直列化不可能なオブジェクトが参照しているときは、複製される前にその参照を禁止する必要があります。例えば、複製されるエージェントでスレッドを利用することがありますが、スレッドは直列化できませんので、このコールバックメソッド内でスレッドを停止し、その参照をやめてから複製をしてください。

複製

void parent(AgentIdentifier aid) {
	/* do something */
}

エージェントの複製が生成された際に呼び出されるメソッドです。ただし、複製により、同じエージェントが二つ存在することになりますが、このメソッドはその内の一方で呼び出されます。そして、引数にはもう一方のエージェントの識別子が入ります。以降では、このメソッドが呼び出されるエージェントを複製されたエージェントまたは親エージェントと呼びます。そしてもう一方を複製したエージェントまたは子エージェントと呼びます。

複製

void child(AgentIdentifier aid) {
	/* do something */
}

エージェントの複製が生成された際に、子エージェント側で呼び出されるメソッドです。返値は親エージェントの識別子となります。

フロント化(廃止予定)

void toFront() {
	/* do something */
}
 

マルチウィンドウシステムでは、エージェントが作成したウィンドウが他のウィンドウの背後になるこがあります。このメソッドは、エージェントランタイムシステムが、このメソッドをもつエージェントが作成したウィンドウが前面に出ることを要求するものです。ウィンドウを前面に移動する処理をこのメソッドに加えます。現在、このメソッドはサポートしていません。

注意

これらのコールバックメソッド(toFront()は除く)は排他的に呼び出されます。つまり、上記のメソッドのうち一つが実行されると他のメソッドを実行することができません。これは、これらのメソッドはエージェントの終了やデータ待避などの基本的な動作をするからです。また、あるコールバックメソッドから別のコールバックメソッドを呼び出さないようにして下さい。これは将来のバージョンでは、コールバックメソッドは Java Reflection の動的メソッド呼び出しを通じて呼び出されるようになるためです。

現在のエージェントランタイムではエージェントは一度に一つのコールバックメソッドしか呼び出されません。このため、その実行モデルはシングルスレッドモデルにもとづくことになりますが、ユーザがスレッドを生成することを制限するものではありません。このため、並列処理が必要な場合はエージェント内でスレッドを生成して下さい。ただし、スレッドはエージェント移動及び永続化の対象になりませんので、移動や永続化の前にスレッドを停止しておく必要があります。

目次に戻る