三、代码例子
这节中提供了一些代码例子关于运行
aglets
。这些代码仅仅为教学使用。
1
、一个基本的
agent
以下的类展示了一个简单的
aglet
,该类一旦被加载,以标准输出的方式打印出一些信息。
import com.ibm.aglet.*;
public class FirstAglet extends Aglet
{
public void run()
{
System.out.println("/n/tHello/n");
for(int i=0;i<10;i++)
{
System.out.println("/n i is "+i);
}
}
}
2
、事件监听
以下的代码例子表明,
MobilityListene
,
CloneListener
和
PersistencyListener
怎样被使用。首先,看看监听器类:
package example.goofy;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
public class myListener implements MobilityListener,CloneListener,PersistencyListener
{
//mobility listener methods
public void onArrival(MobilityEvent event)
{
System.out.println("Agent arrived "+event);
}
public void onDispathching(MobilityEvent event)
{
System.out.println("Before moving... "+event);
}
public void onReverting(MobilityEvent event)
{
System.out.println("Before coming back home... "+event);
}
//clone listener methods
public void onClone(CloneEvent event)
{
System.out.println("I'm the clone "+event);
}
public void onCloned(CloneEvent event)
{
System.out.println("A clone of myself created "+event);
}
public void onCloning(CloneEvent event)
{
System.out.println("Someone is cloning myself "+event);
}
//Persistency listener methods
public void onActivation(PersistencyEvent event)
{
System.out.println("Activating "+event);
}
public void onDeactivating(PersistencyEvent event)
{
System.out.println("Deactivating "+event);
}
}
上面的监听器定义了不同的方法来捕获不同时间的事件,正如代码中解释的一样。以下的
agent
注册上面的监听器,使用它来触发事件。
package examples.goofy;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
public class agletC extends Aglet
{
public boolean move=true;
public void onCreation(Object init)
{
//create a listener object
myListener listener = new myListener();
//register a mobility listener
this.addMobilityListener((MobilityListener)listener);
//register a clone listener
this.addCloneListener((CloneListener)listener);
//register a persistency listener
this.addPersistencyListener((PersistencyListener)listener);
}
public void run()
{
System.out.println("Hello!");
}
}
例如,在
dispatching
之后,
mobility
事件被触发,
agent
在源控制台打印出如下的语句:
Before moving…MobilityEvent[DISPATCHING]
同时,在目的控制台打印出:
Agent arrived MobilityEvent[ARRIVAL]
HELLO
!
为了更好地理解事件监听器是如何工作的,执行以上的
agent
,
cloning
,
dispatching
和
deactivating
,再看看所有控制台打印出的信息。
3
、远程消息
以下的代码表明
agletA
怎样发送一个远程消息给
agent agletB
。请注意:在发送消息时,必须知道远程
agent
的
agletID
,这样才能够通信。
package examples.goofy;
import com.ibm.aglet.*;
import java.net.*;
/**
*
克隆一个
agent
,然后发送一个远程
Hello
消息
*/
public class agletA extends Aglet
{
public void run()
{
try
{
//get the aglet context
AgletCOntext context = this.getAgletContext();
//create an agletB instance
AgletProxy toMove = context.createAglet(null,"examples.goofy.agletB",null);
//save the new aglet ID
AgletID remoteID = toMove.getAgletID();
System.out.println("The new agent has ID = "+remoteID);
//migrate the new agent
String remoteContext = "atp://localhost:5000";
URL url = new URL(remoteContext);
toMove.dispatch(url);
//get the remote proxy
AgletProxy remoteProxy = context.getAgletProxy(url,remoteID);
//send a message to the remote agent
remoteProxy.sendMessage(new Message("HELLO"));
}
catch (Exception e)
{
System.out.println("Exception "+e);
}
}
}
/**
*agletB
*/
package examples.goofy;
import com.ibm.aglet.*;
/**
*Receive a remote message
*/
public class agletB extends Aglet
{
public void run()
{
try
{
//get my ID
AgletID myID = this.getAgletID();
System.out.println("/nMy ID is "+myID);
}
catch (Exception e)
{
System.out.println("Exception "+e);
}
}
//handle the message
public boolean handleMessage(Message msg)
{
if(msg.sameKind("HELLO"))
{
System.out.println("HELLO msg received");
return true;
}
return false;
}
}
请注意:即使在以上的代码中,
getAgletProxy(…)
方法是过时了的,但是对于非过时的方法比如:
AgletProxy remoteProxy = context.getAgletProxy(remoteID);
是不能工作的,因为它仅仅是在本地
agents
上工作的。
MAF(Mobile Agent Finder)
的使用将能够更好的工作,但是同时,在
Aglets
中如何使用它却没有大量的相关文档。