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
中可用的事件