1、agents技术本章覆盖一些基本的关于用Aglets库开发agents的问题。在以下的各节中将展示如何配置主要的开发环境来支持Aglets,怎样编译和运行开发的agents,怎样浏览API库。 一个Aglet(比如,一个agent能够运行在aglets平台上)是一个简单的java类,它必须继承基类com.ibm.aglet.Aglet。必须覆盖基类中的相关方法才能定制aglet的行为,至少得重写run()方法,如果你要得到一个完整的aglet,必须重写所有的方法。一、配置你的IDE(集成开发环境),来使用aglets库 Aglets库是由一个唯一的.jar文件组成,称为aglets-x.x.x
2、.jar,其中x.x.x是该库文件的版本号。为了编译你自己的agents,你必须在你的classpath中加入该jar文件的路径。以下的子节中将描述如何用不同的工具和IDEs来编译agents。1、使用命令行工具(cmd) 你开发agents就跟写去其他的java程序一样,这意味着你用你喜欢的编辑器来编辑你的java文件,然后用cmd来编译(比如javac,jikes)。假如你已经创建和保存了名为FirstAglet.java的agent,如下: import com.ibm.aglet.*; public class FirstAglet extends Aglet public void
3、run() System.out.println(ntHellon); 即使如果你的aglets跟其他的java类一样,他们也不能作为独立的程序运行,因此,你必须使agent在平台上运行。在这之前,你必须使得你的agents能够独立的到达该平台,这就是说你的agent(已编译的类)在服务器的公共根目录下,即Aglets安装平台的默认公共文件夹下。换句话说,你必须拷贝你的agents类文件在上面所说的文件夹下,因此,你在创建对话框中指定你的aglet类的名字。2、使用IBM的Eclipse 在Eclipse下导入jar文件3、使用Sun公司的Netbeans IDE(略)4、使用JBuilder
4、(略)二、基础知识 本节提供开发一个aglet的基本的信息。在以下的内容中你将发现你必须重载的方法,怎样处理引入的消息和怎样捕获事件。1、一个Aglet主要的方法 Aglets就是象开发applet一样的agent,这就是说你必须覆盖一些方法。以下的代码展示了你必须覆盖的主要方法。 package example.goofy; import com.ibm.aglet.*;public class agletD extends Aglet public void onCreation(Object init) System.out.println(Agent created +init); p
5、ublic void run() System.out.println(Agent running); public void onDisposing() System.out.println(Agent quitting); 2、消息处理 利用Aglet开发一个基于消息传递的通信系统:两个agents相互交流必须交换信息。Messages是Message类的一个实例,他们被一个字符串指定。一个agent想清晰地管理消息就必须覆盖handleMessage()方法,如果信息被该agent处理,返回true,否则返回false。以下的一段代码表明一个agent处理所有的消息: package e
6、xamples.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在一个线程内执行,但是线程被
7、运行aglet的平台所管理,为了效率期间,线程可在所有的agents间共享。这种效率的方式可通过买卖方的例子来理解:假设有一对agents,一方扮演卖方,另一方扮演买方。在这种环境下,没必要使得卖方agent将一件商品拿出来出售之前买方agent是活动的,因此,这没有理由使用每一个agent对应一个线程的方法。而且,卖方能够简单地发送一个消息该需要某件商品的买方,然后必须等待买方的回答(比如说,在回答到来之前,该卖方agent必须是不活动的或处于悬挂状态)。以下的这个例子,清晰地表明激活线程(如agents)的数量每次都被减少。在整个的设计中,Aglets开发这种状态:如果agents能够共享
8、相同的线程,不需要创建额外的线程。换句话说,agents的数量并不是严格地个线程的数量关联起来的。 由于Aglet线程模型,理解一个消息被一个线程传递是很重要的,这不同于agent运行时的情况。因为aglets是同步的,如果agent是激活和运行的,才能传递消息,这意味着你的agent正在执行run()方法(或者另一个方法)。事实上,当这个agent正在执行run()方法(或者另一个方法),在该agent内部有一个线程是活动的,由于java的同步性,另一个线程(消息传递线程)不能传递消息。 从以上的考虑中,我们能够明白,一个agent执行一个有(无)限循环将不能接受和处理任何进入的消息是有可能
9、的。然而,这有一种方法可以强迫一个agent释放锁,该方法就是exitMonitor(),这将导致所有的等待信息进入双端队列,同时,所有的线程通过waitMessage()方法被锁来等待重新开始。注意:迫使一个agent来释放锁能产生race状态。3、事件 Aglet支持一个事件/事件监听模型,一个agent能够注册事件监听器来监听某种事件,因此,它能触发那些事件,这有三类主要的事件,绑定于agent生命周期的不同期:closing,mobility和persinstency。下表1展示了各类事件的类型及关联的监听器。 事件类事件监听器事件监听器的方法CloneEventBefore clon
10、ingCloneListeneronCloning()CloneEventAfter cloningCloneListeneronCloning()MobilityEventBefore migratingMobilityListeneronDispatching()MobilityEventWhen the agent arrivesMobilityListeneronArrival()MobilityEventWhen the agent is being retractedMobilityListeneronReverting()PersistencyEventAfter the age
11、nt activationPersistencyListeneronActivation()PersistencyEventBefore the agent deactivationPersistencyListeneronDeactivating()表1:在Aglets中可用的事件三、代码例子 这节中提供了一些代码例子关于运行aglets。这些代码仅仅为教学使用。1、一个基本的agent 以下的类展示了一个简单的aglet,该类一旦被加载,以标准输出的方式打印出一些信息。 import com.ibm.aglet.*; public class FirstAglet extends Agle
12、t public void run() System.out.println(ntHellon); for(int i=0;i10;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 Mobility
13、Listener,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.ou
14、t.println(Before coming back home. +event); /clone listener methods public void onClone(CloneEvent event) System.out.println(Im 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(S
15、omeone 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注册上面的监听器,使用它
16、来触发事件。 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(
17、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 m
18、ovingMobilityEventDISPATCHING 同时,在目的控制台打印出: Agent arrived MobilityEventARRIVAL HELLO! 为了更好地理解事件监听器是如何工作的,执行以上的agent,cloning,dispatching和deactivating,再看看所有控制台打印出的信息。3、远程消息 以下的代码表明agletA怎样发送一个远程消息给agent agletB。请注意:在发送消息时,必须知道远程agent的agletID,这样才能够通信。 package examples.goofy;import com.ibm.aglet.*;import
19、 .*;/*克隆一个agent,然后发送一个远程Hello消息*/public class agletA extends Agletpublic 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 =
20、 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 t
21、o 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 Agletpublic void run() try /get my ID AgletID myID = this.getAgletID(
22、); System.out.println(nMy ID is +myID); catch (Exception e) System.out.println(Exception +e); /handle the messagepublic 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中如何使用它却没有大量的相关文档。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1