2、消息处理
利用Aglet开发一个基于消息传递的通信系统:两个agents相互交流必须交换信息。Messages是Message类的一个实例,他们被一个字符串指定。一个agent想清晰地管理消息就必须覆盖handleMessage(…)方法,如果信息被该agent处理,返回true,否则返回false。以下的一段代码表明一个agent处理所有的消息:
package examples.googy;
import com.ibm.aglet.*;
public class agletE extends Aglet
{
public void run()
{
System.out.println("Agent running");
}
public boolean handleMessage(Message msg)
{
System.out.println("Receive a message "+msg.getKind());
return true;//if the messeage is used
}
}
在做消息处理时,必须明确一个概念。首先,每一个aglet在一个线程内执行,但是线程被运行aglet的平台所管理,为了效率期间,线程可在所有的agents间共享。这种效率的方式可通过买卖方的例子来理解:假设有一对agents,一方扮演卖方,另一方扮演买方。在这种环境下,没必要使得卖方agent将一件商品拿出来出售之前买方agent是活动的,因此,这没有理由使用每一个agent对应一个线程的方法。而且,卖方能够简单地发送一个消息该需要某件商品的买方,然后必须等待买方的回答(比如说,在回答到来之前,该卖方agent必须是不活动的或处于悬挂状态)。以下的这个例子,清晰地表明激活线程(如agents)的数量每次都被减少。在整个的设计中,Aglets开发这种状态:如果agents能够共享相同的线程,不需要创建额外的线程。换句话说,agents的数量并不是严格地个线程的数量关联起来的。
由于Aglet线程模型,理解一个消息被一个线程传递是很重要的,这不同于agent运行时的情况。因为aglets是同步的,如果agent是激活和运行的,才能传递消息,这意味着你的agent正在执行run()方法(或者另一个方法)。事实上,当这个agent正在执行run()方法(或者另一个方法),在该agent内部有一个线程是活动的,由于java的同步性,另一个线程(消息传递线程)不能传递消息。
从以上的考虑中,我们能够明白,一个agent执行一个有(无)限循环将不能接受和处理任何进入的消息是有可能的。然而,这有一种方法可以强迫一个agent释放锁,该方法就是exitMonitor(),这将导致所有的等待信息进入双端队列,同时,所有的线程通过waitMessage()方法被锁来等待重新开始。注意:迫使一个agent来释放锁能产生race状态。
3、事件
Aglet支持一个事件/事件监听模型,一个agent能够注册事件监听器来监听某种事件,因此,它能触发那些事件,这有三类主要的事件,绑定于agent生命周期的不同期:closing,mobility和persinstency。下表1展示了各类事件的类型及关联的监听器。
事件类
|
事件监听器
|
事件监听器的方法
| |
CloneEvent
|
Before cloning
|
CloneListener
|
onCloning(…)
|
CloneEvent
|
After cloning
|
CloneListener
|
onCloning(…)
|
MobilityEvent
|
Before migrating
|
MobilityListener
|
onDispatching(…)
|
MobilityEvent
|
When the agent arrives
|
MobilityListener
|
onArrival(…)
|
MobilityEvent
|
When the agent is being retracted
|
MobilityListener
|
onReverting(…)
|
PersistencyEvent
|
After the agent activation
|
PersistencyListener
|
onActivation(…)
|
PersistencyEvent
|
Before the agent deactivation
|
PersistencyListener
|
onDeactivating(…)
|
表1:在Aglets中可用的事件