使用Aglets开发agents(二)

本文介绍了基于Aglet开发框架中的消息传递与事件监听机制。详细解析了如何通过覆盖handleMessage()方法实现消息处理,并讨论了Aglet线程模型的工作原理。此外,还列举了Aglet支持的主要事件类型及其对应的监听器。
 
2、消息处理
       利用Aglet开发一个基于消息传递的通信系统:两个agents相互交流必须交换信息。MessagesMessage类的一个实例,他们被一个字符串指定。一个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生命周期的不同期:closingmobilitypersinstency。下表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中可用的事件
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值