agents技术.docx

上传人:b****5 文档编号:7510208 上传时间:2023-01-24 格式:DOCX 页数:10 大小:18.95KB
下载 相关 举报
agents技术.docx_第1页
第1页 / 共10页
agents技术.docx_第2页
第2页 / 共10页
agents技术.docx_第3页
第3页 / 共10页
agents技术.docx_第4页
第4页 / 共10页
agents技术.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

agents技术.docx

《agents技术.docx》由会员分享,可在线阅读,更多相关《agents技术.docx(10页珍藏版)》请在冰豆网上搜索。

agents技术.docx

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.jar,其中x.x.x是该库文件的版本号。

为了编译你自己的agents,你必须在你的classpath中加入该jar文件的路径。

以下的子节中将描述如何用不同的工具和IDEs来编译agents。

1、使用命令行工具(cmd)

你开发agents就跟写去其他的java程序一样,这意味着你用你喜欢的编辑器来编辑你的java文件,然后用cmd来编译(比如javac,jikes)。

假如你已经创建和保存了名为FirstAglet.java的agent,如下:

importcom.ibm.aglet.*;

publicclassFirstAgletextendsAglet

{

publicvoidrun()

{

System.out.println("\n\tHello\n");

}

}

即使如果你的aglets跟其他的java类一样,他们也不能作为独立的程序运行,因此,你必须使agent在平台上运行。

在这之前,你必须使得你的agents能够独立的到达该平台,这就是说你的agent(已编译的类)在服务器的公共根目录下,即Aglets安装平台的默认公共文件夹下。

换句话说,你必须拷贝你的agents类文件在上面所说的文件夹下,因此,你在创建对话框中指定你的aglet类的名字。

2、使用IBM的Eclipse

在Eclipse下导入jar文件

3、使用Sun公司的NetbeansIDE(略)

4、使用JBuilder(略)

二、基础知识

本节提供开发一个aglet的基本的信息。

在以下的内容中你将发现你必须重载的方法,怎样处理引入的消息和怎样捕获事件。

1、一个Aglet主要的方法

Aglets就是象开发applet一样的agent,这就是说你必须覆盖一些方法。

以下的代码展示了你必须覆盖的主要方法。

packageexample.goofy;

importcom.ibm.aglet.*;

publicclassagletDextendsAglet

{

publicvoidonCreation(Objectinit)

{

System.out.println("Agentcreated"+init);

}

publicvoidrun()

{

System.out.println("Agentrunning");

}

publicvoidonDisposing()

{

System.out.println("Agentquitting");

}

}

2、消息处理

利用Aglet开发一个基于消息传递的通信系统:

两个agents相互交流必须交换信息。

Messages是Message类的一个实例,他们被一个字符串指定。

一个agent想清晰地管理消息就必须覆盖handleMessage(…)方法,如果信息被该agent处理,返回true,否则返回false。

以下的一段代码表明一个agent处理所有的消息:

packageexamples.googy;

importcom.ibm.aglet.*;

publicclassagletEextendsAglet

{

publicvoidrun()

{

System.out.println("Agentrunning");

}

publicbooleanhandleMessage(Messagemsg)

{

System.out.println("Receiveamessage"+msg.getKind());

returntrue;//ifthemesseageisused

}

}

在做消息处理时,必须明确一个概念。

首先,每一个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

Beforecloning

CloneListener

onCloning(…)

CloneEvent

Aftercloning

CloneListener

onCloning(…)

MobilityEvent

Beforemigrating

MobilityListener

onDispatching(…)

MobilityEvent

Whentheagentarrives

MobilityListener

onArrival(…)

MobilityEvent

Whentheagentisbeingretracted

MobilityListener

onReverting(…)

PersistencyEvent

Aftertheagentactivation

PersistencyListener

onActivation(…)

PersistencyEvent

Beforetheagentdeactivation

PersistencyListener

onDeactivating(…)

表1:

在Aglets中可用的事件

三、代码例子

这节中提供了一些代码例子关于运行aglets。

这些代码仅仅为教学使用。

1、一个基本的agent

以下的类展示了一个简单的aglet,该类一旦被加载,以标准输出的方式打印出一些信息。

importcom.ibm.aglet.*;

publicclassFirstAgletextendsAglet

{

publicvoidrun()

{

System.out.println("\n\tHello\n");

for(inti=0;i<10;i++)

{

System.out.println("\niis"+i);

}

}

}

2、事件监听

以下的代码例子表明,MobilityListene,CloneListener和PersistencyListener怎样被使用。

首先,看看监听器类:

packageexample.goofy;

importcom.ibm.aglet.*;

importcom.ibm.aglet.event.*;

publicclassmyListenerimplementsMobilityListener,CloneListener,PersistencyListener

{

//mobilitylistenermethods

publicvoidonArrival(MobilityEventevent)

{

System.out.println("Agentarrived"+event);

}

publicvoidonDispathching(MobilityEventevent)

{

System.out.println("Beforemoving..."+event);

}

publicvoidonReverting(MobilityEventevent)

{

System.out.println("Beforecomingbackhome..."+event);

}

//clonelistenermethods

publicvoidonClone(CloneEventevent)

{

System.out.println("I'mtheclone"+event);

}

publicvoidonCloned(CloneEventevent)

{

System.out.println("Acloneofmyselfcreated"+event);

}

publicvoidonCloning(CloneEventevent)

{

System.out.println("Someoneiscloningmyself"+event);

}

//Persistencylistenermethods

publicvoidonActivation(PersistencyEventevent)

{

System.out.println("Activating"+event);

}

publicvoidonDeactivating(PersistencyEventevent)

{

System.out.println("Deactivating"+event);

}

}

上面的监听器定义了不同的方法来捕获不同时间的事件,正如代码中解释的一样。

以下的agent注册上面的监听器,使用它来触发事件。

packageexamples.goofy;

importcom.ibm.aglet.*;

importcom.ibm.aglet.event.*;

publicclassagletCextendsAglet

{

publicbooleanmove=true;

publicvoidonCreation(Objectinit)

{

//createalistenerobject

myListenerlistener=newmyListener();

//registeramobilitylistener

this.addMobilityListener((MobilityListener)listener);

//registeraclonelistener

this.addCloneListener((CloneListener)listener);

//registerapersistencylistener

this.addPersistencyListener((PersistencyListener)listener);

}

publicvoidrun()

{

System.out.println("Hello!

");

}

}

例如,在dispatching之后,mobility事件被触发,agent在源控制台打印出如下的语句:

Beforemoving…MobilityEvent[DISPATCHING]

同时,在目的控制台打印出:

AgentarrivedMobilityEvent[ARRIVAL]

HELLO!

为了更好地理解事件监听器是如何工作的,执行以上的agent,cloning,dispatching和deactivating,再看看所有控制台打印出的信息。

3、远程消息

以下的代码表明agletA怎样发送一个远程消息给agentagletB。

请注意:

在发送消息时,必须知道远程agent的agletID,这样才能够通信。

packageexamples.goofy;

importcom.ibm.aglet.*;

import.*;

/**

*克隆一个agent,然后发送一个远程Hello消息

*/

publicclassagletAextendsAglet

{

publicvoidrun()

{

try

{

//gettheagletcontext

AgletCOntextcontext=this.getAgletContext();

//createanagletBinstance

AgletProxytoMove=context.createAglet(null,"examples.goofy.agletB",null);

//savethenewagletID

AgletIDremoteID=toMove.getAgletID();

System.out.println("ThenewagenthasID="+remoteID);

//migratethenewagent

StringremoteContext="atp:

//localhost:

5000";

URLurl=newURL(remoteContext);

toMove.dispatch(url);

//gettheremoteproxy

AgletProxyremoteProxy=context.getAgletProxy(url,remoteID);

//sendamessagetotheremoteagent

remoteProxy.sendMessage(newMessage("HELLO"));

}

catch(Exceptione)

{

System.out.println("Exception"+e);

}

}

}

/**

*agletB

*/

packageexamples.goofy;

importcom.ibm.aglet.*;

/**

*Receivearemotemessage

*/

publicclassagletBextendsAglet

{

publicvoidrun()

{

try

{

//getmyID

AgletIDmyID=this.getAgletID();

System.out.println("\nMyIDis"+myID);

}

catch(Exceptione)

{

System.out.println("Exception"+e);

}

}

//handlethemessage

publicbooleanhandleMessage(Messagemsg)

{

if(msg.sameKind("HELLO"))

{

System.out.println("HELLOmsgreceived");

returntrue;

}

returnfalse;

}

}

请注意:

即使在以上的代码中,getAgletProxy(…)方法是过时了的,但是对于非过时的方法比如:

AgletProxyremoteProxy=context.getAgletProxy(remoteID);

是不能工作的,因为它仅仅是在本地agents上工作的。

MAF(MobileAgentFinder)的使用将能够更好的工作,但是同时,在Aglets中如何使用它却没有大量的相关文档。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1