学习agent必备!最全的JADE程序员指南

上传人:lis****210 文档编号:124545753 上传时间:2022-07-25 格式:DOCX 页数:41 大小:433.57KB
收藏 版权申诉 举报 下载
学习agent必备!最全的JADE程序员指南_第1页
第1页 / 共41页
学习agent必备!最全的JADE程序员指南_第2页
第2页 / 共41页
学习agent必备!最全的JADE程序员指南_第3页
第3页 / 共41页
资源描述:

《学习agent必备!最全的JADE程序员指南》由会员分享,可在线阅读,更多相关《学习agent必备!最全的JADE程序员指南(41页珍藏版)》请在装配图网上搜索。

1、JADE程序员指导Jade集成开发环境是一个入门级的产品,但是它仍然拥有强大的功能。它提供的用户图形界 面包含了大部分SUN SDK工具,可以方便的编辑源代码,生成一个类,执行一个java程序 或java applet. Jade提供的高效率的功能可以让你为每个project生成单独的类模板,这个功 能包括生成使用AWT或Swing APIs对话窗口。Jade可以使用Sure shot的Jive Lint支持静 态代码检查,同时也提供了入门级的调试功能。新版本提供了如下功能:允许用户在XML 编辑器中调用用户提供的函数;方法定位(method location)采用了树形视图。1简介程序员指南

2、由管理员指南作为补充,在jade/doc目录下可以找到可用的HTML文档。如果 本指南和HTML文档之间哪里出现了冲突,以经常更新的HTML文档为准。JADE (Java Agent Development Framework)是一个软件开发框架,它可以为智能AGENT 开发多AGENT系统和遵守FIAP协议的应用程序。它包含两个主要的产品:一个是与FIPA 相适应的agent平台,另一个是开发Java agents的包。JADE是完全用JAVA编码的,如果 agent程序员想探索本框架,他/她的agents就应该按照这个程序员指南中描述的大纲用Java 编码。这个指南是在假设读者熟悉FIPA

3、标准,至少是熟悉Agent Management specifications(FIPA no.23),Agent Communication Language 和 ACL Message Structure(FIPA no.61)的基础上编 写的JADE是用JAVA写的由各种JAVA包构成,给程序设计者以完备的功能接口和规范的抽象 性界面,具体应用取决与任务。选择JAVA语言是因为它有许多独特的特点,尤其是在分布 式异质环境下的面向对象的编程连接方式;这些特点还包括Object Serialization, Reflection API 和 Remote Method Invocation(

4、RMI)。JADE由如下的包构成:Jade.core-执行系统核心问题,包括必须由软件程序员扩展的Agent类,除此之外一个行为类 包含在jade.core.behaviours子包内。行为执行agent的任务或目的。它们是可以完成不同复 杂任务或并行任务的逻辑行为单元。程序员编写行为定义agent的操作,并相互连接他们定 义agent执行路径。jade.lang.acl子包用来根据FIAP标准规范处理ACL的。jade.content子包包含了一系列支持用户定义的本体和内容语言的类。单独有一个指南描述 如何使用JADE支持消息内容。尤其是jade.content.lang.sl包含了 SL编

5、码解码器,包含有皮 剖析器和解码器。jade.domainb包:包含了 FIPA标准定义的表示Agent管理实体的所有Java类,特别是AMS agents和 DF agents,提供生命周期服务,白页和黄页服务。子包 jade.domain.FIPAAgentManagemnt包含 FIPA-Agent-Management Ontology和所有表示它的概 念的类。而子包jade.domain.JADEAgentManagemnt包含JADE的Agent管理的扩展名(比 如,为 sniffing messages, controlling the life-cycle of agents,

6、),包括本体和表示它的概念 所有类。子包 jade.domain.introspection 包含用于 JADE 工具(比如,sniffer 和 Introspector) 间引用域和JADE核心的概念。子包jade.domain.mobility包含用于移动通信的概念。jade.gui包:包含了一系列有助于创建GUIs的普通类,用于显示和编辑Agent-Identifiers, Agent Descriptions,ACLMessages,.jade.mtp包:包含一个为容易地与JADE框架整合,每一个MTP都应该执行的Java接口, 和一系列这些协议的实现。jade.proto 包:包含模

7、拟标准交互协议(例如: fipa-request, fipa-query, fipa-contract-net, fipa-subscribe和由FIPA定义的其它一些协议)的类,和帮助程序员创建他们自己的协议的 类。FIPA包包含由FIPA为基于IIOP的消息传输定义的IDL模块。最后,jade.wrapper包提供JADE高层次封装功能,这可以将JADE的用法作为库,从而使 外部的Java程序启动JADE agents和agent容器(见3.8节)。JADE还包括一些工具,用来简化平添管理和应用开发。每个工具包含在jade.tools的一个 单独的包内。目前,以下工具是可用的:Remote

8、 Management Agent (RMA):作为平台管理和控制的图形控制台。第一个RMA实例 可以通过命令行选项“-gui”)来启动,但是以后可以激活多个GUI。通过简单的用多台调 频发射机向所有RMAs播送一个事件,JADE在多RMAs保持一致性。而且,RMA控制台 能启动其它JADE工具。Dummy Agent:是一个监控和调试工具,由图形用户界面和潜在的JADE agent构成。用GUI 可能写出ACL消息,并将消息发送给其他agents;也可能显示所有发送或接收到的ACL消 息,以及为了便于agent通话记录和复述的时间戳信息。Sniffer:是一个在ACL消息传输时可以截取ACL

9、消息,并用类似与UML程序表的符号将 消息图形式显示的agent。它有助于通过观察agents如何交换ACL消息来调试你的agent社 会。Introspector:可以监控agent生命周期,它交换的ACL消息和执行的行为的agent。DF GUI:是一个完全的图形用户界面,被默认的JADE DF使用,也可以被其它每一个用户 可能需要的DF使用。以这种方式,用户可能创黄页域和子域的复杂网络。GUI可以用简单 直觉的方式控制DF的知识库,使DF和其它DF联合,和远程控制(注册/注销/修改/搜索) DF父亲DF和孩子DF的知识库(执行域和子域网络)。LogManagerAgent:允许在运行时设

10、置日志信息,如日志水平,对于用Java日志的JADE和 程序应用的特殊类来说。SocketProxyAgent:是一个普通的agent,作为JADE平台和普通TCP/IP连接间的双向通道。 仔细考虑JADE所有的传输服务,ACL消息被转换成简单的ASCII字符串并通过套接字连 接传输。反过来,ACL消息可以通过TCP/IP连接到JADE平台传送。这个agent是有用的, 例如,处理网络防火墙或在Web浏览器中提供与Java applets交互的平台。JADEtm是一个由CSELT3注册的商标。JADE由五部分组成:混淆器、加密器、封装器、类编辑器和输出工具。混淆器能够保护软件使之不被反编译。它

11、通过混淆类文件使得反编译无效,并把敏感的名字 指代变成另一个名字空间,这样可以使反编译的结果毫无疑义。混淆器有完全”和快速两 种选项,能处理任何Java产品包括API,应用程序和小程序。它遵从Java虚拟机规范。加密器隐藏和加密用户产品的主类,处理的结果是一个类文件。它为编码和反编码提供了一 个界面。JADE有一些类用DES完成这个界面。加密和解密的过程对于用户来说是透明的。 用户感觉不到使用原始的主类和使用处理后的结果类有什么不同。当然,用户也可以不加密 地处理这些主类和产品。封装器不仅仅处理类文件,它还隐藏和加密在产品根目录下的其它文件。它封装产品并只产 生一个类。软件厂商把这个类销售给用

12、户,用户将运行这个类文件,安装买来的软件。封装2 JADE的特征下面是JADE为agent程序员提供的特征列表: 分布式的agent平台:agent平台可以分布在许多主机之中(假设他们通过RMI连接)。 在每台主机上只有一个Java应用程序,因此也就只有一个Java虚拟机运行。Agents 以Java的思路执行,存在于Agent容器中,agent容易为在运行时为agent执行提供 支持。 图形用户界面:从远程主机来管理若干agents和agents容器。 调试工具:帮助开发基于JADE的多agents软件程序。 通过行为模型支持agent活动的多重、平行和并行执行。JADE以非优先权的方式安排

13、 agent的行为。 遵循FIPA的agent平台:它包括AMS、DF和ACC。所有这三个组成都在agent平台 启动时自动激活。 许多遵循FIPA的DFs可以在运行时启动以执行多域程序,一个域是指一系列逻辑 agents,它们的服务通过一个共同的facilitator发布。每个DF继承一个GUI和所有由 FIPA定义的标准能力(例如,注册,注销,修改和搜索agent描述的能力,DF网络内 联盟的能力)。 在同一个agent平台内有效传输ACL消息。事实上,消息被编译成Java对象而不是字 符串的形式进行传输,以避免集结或未编组的程序。当跨越平台边界时,消息自动转换 成/自基于FIPA语法、编

14、码和传输协议。这种转换对只需要处理Java对象的agent的 执行者是很明显的。 备用的FIPA交互协议库。 Agent在AMS上的自动注册和注销。 遵循FIPA的命名服务:在启动agents时从平台上获取它们的GUID(Globally Unique Identifier)o 支持程序定义的内容语言和本体。 InProcess接口允许外部程序启动自治agents。3用JADE创建多agent系统本章描述支持多agent系统开发的JADE类。JADE遵循句法规则,有写地方遵循FIPA规范 的语法3.1代理平台FIPA定义的一个agent平台的标准模型,如下图所示:AMS是管理控制进出和使用AP

15、的agent。一个平台上只能有一个AMS。它提供百页和生命 周期服务,维护AID目录和agent状态。为了获得有效的AID,每个agent都必须在AMS 上注册。DF是平台上提供默认黄页服务的agent。消息传输系统也叫agent通信通道(ACC),由软件构成在平台内负责所有的消息交换,包 括来自或发送到远程平台的消息。JADE完全遵守这个参考架构,当一个JADE平台被启动,AMS和DF立刻被创建,ACC 模块也设置为允许消息通信。Agent平台可以分布在不同的主机上。但一台主机上只能有一 个应用程序即一个JAVA虚拟机运行。每个JVM是一个基本的agents容器,它为agent的执 行提供完

16、全运行时环境,并允许若干 agents在同一台主机上并行执行。创建主容器或 front-end,它是AMS和DF存在以及RMI注册的agent容器,被JADE内部使用。其它agent 容器与主容器相连,为任何JADE agents的执行提供完全运行时环境。Hwl一1点成rl_c-4=iEJ=L-dUigurs 2 - JADE Ag&M P:i啊啷 tfisiri bitted ovsr sev&rdi coma in ers根据 FIPA 规范,DF 和 AMS agents 通信使用 FIPA-SL0 内容语言,fipa-agent-management 本体,fipa-request交互

17、协议。JADE为所有这些部分提供编译执行: SL0内容语言是由jade.content.lang.sl.SLCodec类执行的,使用此语言的自动功能可以 用 getContentManager().registerLanguage(new SLCodec(0)方法添加到任何 agent。 本体概念(除了 jade.core.AID 执行的 AID)被 jade.domain.FIPAAgentManagement包中 类执行。FIPAManagementOntology类定义了与本体符号一致的词汇。用下面的代码使 用本体的自动能力可以添加到任何agent:t t n tMan =. ge: r

18、 () . r ci.5T.er Dr-::-lc:gy ; FI AX a n g *z:iv. e n t C: n t :: L:- c y . ce 最后,fipa-request交互协议作为ready-to-use行为执行,存在于jade.proto包内。3.1.1FIPA-Agent-Management 本体每一个使用fipa-agent-management本体的类都是一个简单的属性集合,根据基于表示FIPA 的fipa-agent-management本体概念的模型框架,用公共方法读写它们。使用下面的规定:为 类的每个属性的attrName命名和attrType指明类型,有两

19、种可能的情况:1)属性类型是一个单一值,则它们由attrType getAttrName()读取,由void setAttrName(attrType 2)写入,每次调用setAttrName()后的执行结果将重写以前的属性值。2)属性类型是一系列的值,则用void addAttrName(attrType a方法插入一个新值,void clearAllAttrName()方法移除所有的值(列表变为空)。读取则用返回Iterator对象的 Iterator getAllAttrName()方法,允许程序员查看列表并将列表元素设置合适的类型。参考HTML文档查看这些类和它们的接口的完整列表。3.

20、1.1.1本体的基本概念包jade.content.onto.basic之中包含一系列类,它们是每个本体的通用部分,如Action,TrueProposition,Result,正如3.6节所讲的BasicOntology可以加入任何用户定义的本体。 注意:Action类被用于表示行为。它有一对方法来set/get行为者的AID (如应该表现行为 的agent)和行为本身(如注册/注销/修改)。3.1.2简化API以访问DF和AMS服务目前为止描述的JADE特征允许FIPA系统agents和用户定义agents之间通过简单的发送和 接收由标准定义的消息进行交互。然而,因为那些交互被充分的标准化

21、,因为它们非常一般,下面的类可以用简化的接口成功 完成这一任务。Agent类用两种方法得到平台默认DF和AMS的AID: getDefaultDF()和getAMS()。 3.1.2.1DF 服务jade.domain.DFService执行了一系列与标准FIPA DF服务通信的静态方法(如黄页agent)。 它包括的方法有:从DF请求注册,注销,修改和搜索行为。这种方法的每个版本带有所有 需要的参数,以及它们的子集,省略的参数以缺省值填充。注意:这些方法block每一个agent活动直到该活动成功执行或抛出一个 jade.domain.FIPAException异常(如因为DF接收到一个fa

22、ilure消息),即直到对话结束。 另外,有一些情况,以non-blocking方式执行这些任务更方便。在这些情况下,应该用 jade.proto.AchieveREInitiator 或 jade.proto.SubscriptionInitiator(见 3.4.12 节)关联 createRequestMessage(), createSubscriptionMessage(), decodeDone(), decodeResult() 和DecodeNotification()方法,以方便到/从DF发送/接收的消息的准备和解码。下面这段 代码解释了 agent与默认的DF协商的情况:基

23、本的DF语句:DFAgentDescription template = / fill theJkID dlf = getDefaultDF ();JkCLMessage subs = DFS ervicec re ae SuId s c rIpt-ionMe s s age (thi is r df r template null) Behaviour b = new Subscriptionlnitiater t;hisf subs) c-rotected void handle-inform (ACLMessage inforn) ( try DFAge:nE:scr ipion dfd

24、ls =DFService . decodeNotif icat;ion (inform. getContent (); / do somethingcatch (FIPAExcept-ion. fe) ( fe.printStack!race();addB=haviour (b);3.1.2.2AMS 服务这个类是DFService的二重类,访问由标准的FIPA AMSagen t提供的服务,它的接口完全相 当于一个DFService接口。注意:在分别调用setup()方法前和takeDown()方法后,JADE用默认的AMS自动调 用注册和注消方法,所以对一般程序员来说不需要调用它们。然而

25、,在某些情况下,程序员可能需要调用它的方法。例如:当一个agent想在远程agent 平台的AMS上注册时,或者当一个agent想通过添加私有地址到它的地址序列从而修改它 的描述时,3.2 agent 类Agent类对用户定义的agents来说表示一个通用的基本类。因此,从程序员观点来说,JADE agent简单地说就是一个从基本Agent类扩展来的用户定义的Java类的实例。这就意味着对 在agent平台上完成基本交互的特征(注册、配置、远程管理、.)和可以被调用执行agent 规定的行为的一系列基本方法(如 send/receive message, use standard intera

26、ction protocols, register with several domains,.)的继承。Agent的计算模型是多任务的,任务(或行为)是并发执行的。Agent提供的每项功能/服务 应该作为一个或多个行为执行(参考3.4节行为执行)。调度程序对基本agent类是内部的, 而对程序员来说是隐藏的,自动管理行为的调度。3.2.1agent的生命周期Figure 3 - _坦河cic as by FIPA根据FIAP规范中的AP生命周期理论,JADE agent可以处于若干状态中的一种,如图3所 示,下面将详细介绍: 创建:创建agent对象,但没有在AMS上注册,也没有名字和地址,

27、不能其它agents 通信。 活动:agent对象在AMS上注册,有一个合格的名字和地址,可以访问所有JADE特征。 挂起:agent对象当前被停止。它的内部线程被暂停,没有agent行为被执行。 等待:agent对象被阻塞,等待什么。它的内部线程处于睡眠状态,当一些条件满足时 被唤醒(典型地是消息到达)。 删除:agent明确地死亡。内部线程终止它的执行,agents不再注册在AMS上。 转移:当移动agent向新的地址迁移时进入这个状态。系统连续缓存消息,之后将发往 它的新的地址。Agent类提供公共方法使其在各种状态间转换,这些方法从FIPA规范agent管理中的有限状 态机(the F

28、inite State Machine)内的适当的转换中获取它们的名字。例如,doWait()方法把agent从活动的状态转变为等待状态,doSuspend()方法把agent 从活动或等待状态转变为挂起状态,.参考agent类的HTML文档,它提供这些doXXX() 方法的完整列表。注意:只有在活动状态下,代理才能执行它的行为(即它的任务)。小心:如果任何一个行 为调用doWait()方法,那么整个agent和它的所有活动都将被阻塞,而不仅仅是调用该方 法的行为。block()方法是Behaviour类的一部分,它允许单个agent行为挂起(详见3.4 节的行为用法)。3.2.1.1启动ag

29、ent执行JADE框架根据一下步骤控制新的agent的诞生:执行agent构造器,给agent赋一个标识符 (见jade.core.AID类的HTML文档),在AMS上注册,进入活动状态,最后执行setup() 方法。根据FIPA规范,agent标识符有一下属性: 一个全局唯一的名字。默认情况下由JADE用本地名字串联组成一一例如,命令行提供的agent名字加上“ ”,再加上本地AP标识符例如: / JADE);还有一种情况在命令行说明平台名字,本地名字加上加上规定的平台名字串联组成agent名字。 一系列agent地址。每个agent继承本地agent平台的传输地址。 一系列解释器,例如ag

30、ent注册用的白页服务。setup()方法是应用程序定义的agent活动开始的点。程序员要想初始化agent,必须执行 setup()方法。setup()方法执行后,agent就已在AMS上注册,它的AP状态处于活动状态。 程序员应该用以下初始化程序:一(可选的)如果需要,修改AMS注册数据(见3.1.2)一(可选的)如果需要,设置agent的描述和它提供的服务,以及在一个或多个域注册agent, 比如 DFs (见 3.1.2)(必选的)用addBehaviour()方法添加任务到准备好的任务队列。一旦setup()方法结束,就安排这些行为。setup()方法给agent至少添加一个行为。s

31、etup()方法结束后,JADE自动执行准备好的任务队 列中的第一个行为,然后用无优先的循环调度方法切换到队列中的其它行为。Agent类的 addBehaviour(Behaviour)和 removeBehaviour(Behaviour)方法可以用于管理任务队列。3.2.1.2停止agent执行任何行为都可以调用Agent.doDelete()方法来停止agent运行。当agent将要进入DELETED状态时,运行Agent.takeDown()方法,例如agent被销毁的 时候。takeDown()方法可以被程序员重写以执行任何必要的清理。当这个方法执行的时 候,agent仍然注册在AM

32、S上,从而可以给其它agents发送消息,但是takeDown()方法完 成后,agent将注销,它的线程也将被销毁。这个方法想要的目的的执行程序指定的清除操 作,如DF agents上的注销。3.2.2 agents 间通信Agent类也提供一系列agents间通信的方法。根据FIPA规范,agents通过异步消息传输通 信,ACLMessage类的对象是交换的有效载荷。也可以参见3.3节对ACLMessage类的描述。 FIPA定义的一些交互协议如ready-to-use行为一样可以为agent活动指定;它们是jade.proto 包的一部分。Agent.send()方法允许发送ACLMe

33、ssage。receiver字段的值表明接收anget的IDs列表。 该方法在agent所在的地方是完全透明的,比如作为本地的或远程的agent,平台认真选择 的最合适的地址和传输机制。3.2.2.1访问私有消息队列平台通过一个agent将所有收到的消息加入agent私有队列。(从JADE2.5开始)队列的默认 规模是无限制的,但是,有限资源的事情下,可以通过setQueueSize ()方法改变缺省值。 可以通过若干中访问模式从这个私有队列中得到消息:可以以控制(使用blockingReceive()方法)或非控制方式(用receive。方法)访问消息 队列。必须慎用控制方式,因为它会引起所

34、有agent活动挂起,尤其是它所有的行为。当队 列中没有请求消息时,非控制方式立刻返回null。两种方法都可以通过pattern-matching能力扩展,传入一个描述请求的ACLMessage的方 式的参数。3.3.4描述的MessageTemplate类。一控制访问可以有一个时间间隔参数。它是长整型的,用来描述为请求消息agent活动应该 保持控制等待状态的最大毫秒数。如果消息到达前超过了间隔时间,该方法返回null。两个行为ReceiverBehaviour和SenderBehaviour可以用来安排请求接收或发送消息的agent 任务。3.2.3图形交互界面agent一个构建多agen

35、t系统的应用程序仍然需要与用户交互。所以,有必要提供GUI,至少是为 程序中的一些agents提供。这一需要仍引发了一些问题,是由agent的自治属性和普通GUI 的反作用属性之间的不匹配引发的。这些是JADE需要提高一些问题。当JADE被使用,JADE agents的thread-per-agent并行模型必须和Swing并行模型一起工作。3.2.3.1 Java GUI 并行模型在一个JAVA虚拟机上有一个单一线程,成为Event Dispatcher Thread,它的任务是从System Event Queue (它是java.awt.EventQueue类的一个实例)中连续选择事件对

36、象(比如: java.awt.AWTEvent类的实例)。然后其它事情中的事件调度线程,调用各种注册到事件资 源的监听者。重要观察的是所有的事件监听者都在一个单一的控制线程( the event dispatcher)中执行;因为这遵循已知的规则,所以每个事件监听者的执行时间应该缩短(小 于0.1s)以确保界面响应。一个重要的Swing特征是Model/View系统来管理GUI更新。Swing控制器有某种状态(JCheckBox有checked标识,JList持有元素,等等),这状态保 存在Model对象(DefaultButtonModel类,ListModel类,等)中。model类提供修

37、改状态 的命令(比如,检测或不检测checkbox, list中添加或去除元素,等),并且Swing建立了 告知机制,更新可见的GUI的外观以反映状态的改变。所以JCheckBox对象可以在两种情 况下改变它的外观: 从用户接收到事件(如,一个MouseClick事件) 程序中的其它部分改变了和JChecBox相关的model对象正如在JAVA指南(JFC/Swing trail、Threads和Swing部分)里指出的一样,Swing框架不 是线程安全的,因此任何更新GUI元素的代码必须在事件调度线程之内执行;因为改变一 个model对象会引发GUI的更新,所以按照上面所说的,model对象

38、也必须由事件调度线程 来控制。Swing框架提供了一个简单但通用的方式将一些用户定义的代码传给EventDispatcher thread: SwingUtilities类包含了两个静态方法,接受 Runnable对象,用 RunnableEvent 将其封装,并把它放到 System Event Queue 中。invokeLater()方法把 Runnable 放入System Event Queue中,并立即返回(此行为类似于异步交互线程调用),而invokeAndWait()方法把 Runnable 放入 System Event Queue 中,就休眠直到 Event Dispatc

39、her thread处理了 RunnableEvent (此行为类似于同步交互线程调用)。而且,invokeAndWait()方 法可以捕获由Runnable对象抛出的异常。3.2.3.2为响应一个GUI事件做一次ACL信息交换当一个agent被给一个GUI时,则因为用户的动作,要求该agent发送一个消息(例如,用 户点击了 pushbutton)o ActionListener按钮将在事件调度线程之内运行,而Agent.send () 方法应当在agent线程之内调用。所以:在事件监听者中,给agent添加一个新的行为,以执行必须的通信。如果做的通讯是一个简单的信息传送操作,可以使用Sen

40、derBehaviour类,事件管理者将包 括一行代码如下:myAgent.addBehaviour (new SenderBehaviour (msgToSend );如果通讯操作是一个信息接收操作,同样地可以用ReceiverBehaviour类: myAgent.addBehaviour (new ReceiverBehaviour (msgToRecv );更一般地说,当用户在GUI上操作时,一些复杂的会话(例如,遵循交互协议的整个交互 过程)就会启动。在一次,这个方法给agent添加一个新的行为;这个行为将为交互协议扩 展预先定义的JADE behaviours类,或将是一个定制的复

41、杂行为。下面的代码是从JADE RMA management agent中抽取出来的。当用户要创建一个新的agent 的时候,他/她就在RMA GUI上操作(通过菜单栏,工具栏或弹出菜单)执行 StartNewAgentAction对象,该对象调用rma类的newAgent()方法。这一方法代码如下:p _icl ic vc id 口三:-;二三己二二二s. jent二Mir.m,class s.ir.e .r 口己二二H E 二 t二nm c; / Oe己日七己 a匚匚二二己二i二 jkj 己二二 z二二己 JICL 5ztge ./ .Set the : z:ntc Lc .51 st 二

42、二己 ir.e.5srequm s Ms,j . m三二。二二二 1 o j =,(jmtMs.ns.qeir.etl C:ntz:j ;/ Fill 广此己夕三勺岂 za List 11 z snTrtinin 二?i亡ziLL ZCnTent;ad,三三亡二mt (n已: A2-L5CLi?ntBhjtvic_ir (11rj ;AMSClientBehaviour类是ram类的一个私有内部类,它扩展自 FipaRequestInitiatorBehaviour, 与AMS agent间使用fipa-request交互协议。在这种情况下,addBehaviour()调用和特定行为 类的添加

43、都被完全封装到rma类内。RMA GUI(主要是action类)的各种类都参考RMA agent, 并用它来调用方法,如newAgent()o注意:像newAgent()之类的方法并不是真正属于该agent 的,因为它们不以任何方式访问该agent。所以,它们是为了从外部(不同的执行线程)调 用而设计的:接下来,这些方法将称为external methods o一般来说,一个外部软件组件维持关于agent的直接对象不是件好事,因为这个组件可以直 接调用该agent的任何公共方法(而不仅仅是外部的方法),跳过异步消息传输层,把自治 agent转换为服务对象,从属于它的调用者。更好的方法是将所有的

44、外部方法集中到一个接 口,再由agent类使用。这样涉及到该接口的对象将被传送到GUI,这样只有外部方法可以 从事件管理者那里调用。下面的代码将解释这个方法;interfaceterna 1 void newAgent (String agentNaMef String classNaMe, Object arg f String containerName);void auapendAgent(AID name);void reaJineAgent (AID name);void kLllAgent (AID naie);void kLllContainer (String naine);v

45、oid ahutDownPlatform ();class MainWindow extends JFrame (private ZyiAExterna 1 myRfrIA;p_icLie M日imdCW c.n3U-lA; : ir.y?;-IA = eR-M:H .? ric. Ktds 邕q已二二 二:tieI己rr.已n二m 7U-lALxTmc.l n Y己二己 lain?jnck-w .yG JI;:!: CJ- rd r: id .5 rtip ( )ir.y rUZ = 二ew Ms. i二&;i_n三;?,二三iE i ; . .Fara.ezer 1 thi.5 1 二寸三

46、,已三 as M2冬Ew二mtnmL “-上面的例子,GUI智能调用RMA agent的外部方法。3.2.3.3收至U ACL消息时修改GUIAnget可以通过ACL消息从其它agents获取消息:FIPA通信原语inform就是用于此目的。 如果该gent有一个GUI,它会想经常通过改变可视的GUI外观和它的用户交流新的信息。 根据Model/View模式,新消息应该用于修改一些model对象,Swing会自动更新GUI。用 于读取消息的Agent.receive()操作在agent线程中执行,但是对Swing model对象的修改必须 从Event Dispathcer线程中执行。所以:在

47、agent行为中,将所有对 GUI model对象的访问封装成一个Runnable对象,用SwingUtilities.invokeXXX()将 Runnable 提交给 Event Dispathcer 线程。例如,当一个新的agent在JADE平台诞生,AMS就会发送inform消息给所有的活动的RMA agents;它们当中的每个agent都要更新它的AgentTree,添加代表新agent的节点。rma类 掌管着(内部的和私有的)AMSListerner类的行为,它不断从AMS接收inform消息,并将 消息发送给合适的内部事件管理者(它基本上是一个简单地分布式的ACL消息上的事件系

48、统)。与agent-born事件相对应的管理者有下面的代码:public vc-id handle (MSEvent ev) (AgentBaxn ab = (AgentBarn)ev;String container = ab.getContainer();AID agent = ab.geAgent();myGUI.addAgent(containerf agent);The addAgent () method of the class MainWndow is the following:public void addAgent(final String containerName f

49、inal AID agentID) ( / Add an agent to the specified container Runnable addlt 二 new Runnable() ( public void run() (String agentName = a gent ZD .();AgentTree Node node = tree tre&Agent c re a t eNe wN de (a gent Name f 1); Iterator add = agent-ID . getAllAddresaea ();String agentAddresses = 11 rr;wh

50、ile(add.hasNex-()agentAddre ases agenAddres s e s + add. next () 一 11 11;tree . treeAgent . addAgentNode ( (AgentTree . AgentNode) node,c n t a i ne r Name f agentName, age nt Add r e s s e s, EIPAAGENT0 );JSwingUti1ities.invok&Later(addlt);正如从上面代码中看到的,对agent树的所有访问都被封装到Runnable中,用 SwingUtilities.inv

51、okeLater()方法提交到 Event Dispatcher 线程执行。整个 Runnable 创建和提 交过程都包含在MainWindow类的addAgent()方法中,这样rma agent不直接处理Swing调 用(它甚至不必引用Swing相关类)。如果我们将整个 MainWindow作为一个活动对象,它的线程是Event Dispatcher线程, addAgent()方法明显的是一个外部方法,这个方法准确反映了上面部分中用到的技术。但是, 因为GUI没有被看做自治软件组件,所以是否选择使用外部方法只是一个软件结构问题, 没有特殊的概念意义。3.2.3.4在JADE上构建GUI可用

52、的agents使agents拥有GUI是件很普通的事情,JADE包含jade.gui.GuiAgent类以达到这个目的。这个类是jade.core.Agent类的简单扩展:在启动(setup()方法执行的时候)的时候,它建立 ad-hoc behaviour的实例,管理jade.gui.GuiEvent事件对象的队,该队列可以被其它线程接收。 当然,这个行为对程序员是隐藏的,他们只需要实现和每个事件相关的应用程序代码。详细 地说,必须执行下面的操作。一个线程(尤其是 GUI)希望通知一个事件给一个agent,它就应该创建一个新的jade.gui.GuiEvent类型的对象,并将它作为参数传给j

53、ade.gui.GuiAgent对象的postGuieEvent 方法的调用。postGuiEvent()方法调用后,agent通过唤醒所有它的活动行为作为反应,尤其 是上面提到使agent线程执行onGuiEvent()方法的行为。注意:GuiEvent对象有两个必须的 属性(the source of the event 和 an integer identifying the type of event)和一个可以添加到 event 对象的可选参数列表。作为结果,希望从另一线程(尤其是它的GUI)接收事件的agent应该定义它想接收的事件 的类型,然后执行onGuiEvent ()方法。

54、一般来说,这个方法是一个大的循环,每种情况对应 一种事件类型。JADE发布的mobile例子就是一个很好的例子。为了进一步解释前面的概念,下面给出一些关于MobileAgent例子的有趣的代码段:File MobileAgent.javap-ihlic cl5z Mm独七亡/ Thmmm consTftnTZ m二三二h己 Mi乙 二二 pc = Zvnt5 二二 二上亡二s-aties-aties-aties-aties-atics-aticf ir finalf irciLf irciLf irLn-Ln-Ln-Ln-rn-rn-ZXIT = 1J 0 0;= _L Ji;C.LONI=

55、1J:D;p -ik lie vc( )_/ 二二三m二w.m s.ndr-UZqu.、 = n亡k Mei I - i ;i h 1 e 二二l;三;;H 孔三三NT OPIP_TZO1:3 FOLLOW I MJ 匚口工 ZVZKTS?匚=二三三 v : i cl c:nG-ii Zvent.ev jm y:L 二h : ev .(i ;ZX:T:j3 s e ();j_ii = null;i ?ZeleTe ();cre5.;二沦己 1-lCVH_HVZK,Z :Iz-er rite r i3Vi=?5.r5.r.eT.er s = ev . -jeTAllE rir ter ; ;ne

56、xz-STe = L :r.; mcvePrir rnr.e ter s r nexz. );c3?-lcve (n;=XT.?iTei ;;Lr5.k;2m :LD2;Z_Z7EMT :iTratc r 二二匚二己 Ed. rEKi 己二己 rm = 亡*、七独 LL 三氏氏 ic.m 二士。() nwxt芝二二三 =;Lcc.5.Ti Ln)二二匚n己murMir.己二己rm . next (); 三;.二乙二二亡 inxTZit= H 二乙二二三一二n二一”二三一己二N&*.三 i); ;Lr5.k;mm己.= T:?_LVKT :m3.1上 二口己t (;;hrak;mm 己 CONT

57、Z XUZ_Z VZ二二:cCTin j.C sunTr (J ;hrak;mm 己 REFRZ M H_E7EMT :c.cdBehrivisjr :二wk,?e tArc. 1L rib 1riT 1 CI1= BhriVl S-11:(Thi.5;);hrak;:File Mobi1eAgentGui.j avapac已乂己吁荟 L已 m . znuLLlm;pah lie cLc.seMc】z:二 L已弓目己二二=_iiexpends JFrimpL 已 zn 己 ntmActiCnListr :privRT-e MchileA jent rr.yAqent;/ CsnTr jTC r

58、MobileAgentGui (MobileAgent a-ipr ();L.yWg 三 n 二=a;JB j.tz.3R aM JEwE_i二二,二二=WR JE jt c,n ( 5 TO? CCCNTZ?.11 :;pa_;.5BL;tTcn . c.cdA:Tc 二Lim己n己r (this i ;匚占,_1 二。二二 c-r.-r.-A53v,-n = rm; JB j.Ttcn ( ONTZMUZ匚二二KIEM” )gc Tini.;eB j.T t nr . RcldAc.t LCnLs tnr (二上im:l ;b . S-ddAGtiGnLisTenr (thi.3 );b

59、= rw JE a t - c- n I i0VL LAE Z L);h . s.ddJicticnLL3Tnr (this );b = rw JE i t t c- n I : L D1;Z LABE L ;;h . s.ddJicticnLL3Tnr (this );b = rw JEutTC-n (IXZTLAEIL);b . s.diJicticnLL3Tnr (this );public, d、土 aczi nEr zorrr.-i ( Act!: v=nt 己;3-cc ir.nd = 亡.,j己二Wc 二,二二匚UEmEiid ();/ kOVE if (c;rCi L IEmm

60、七 = s.v5iLLc.jCL3LLis tMclL . crtZlntAt (s=l ;己t =二Le.%二亡5二二己LLmj亡七EL己:n己!itJit:Cj ;己* = ne: =L :d=st = =vlwL.5tt-kd- . wtZLx=ntJt (sLi i 己Is 士三已己七 = =iV31 LGi-LiiLZ.izLz-3tt-kdel .(C;;3-ij_Zvent =v = n.e ?i;2_LrerT i (Ob j =cz; r.l =. C.LCKZ_ZZ:?T);av. &,三dmararr.w二w二:d* = s j ;r.ant ,tG j. iZvenz

61、三v) j: -/ xzr=1 = =:rr.An-i . e Z : ireCi s (ZZZTLAEZL j ; G-ii_Zvent ev = 二 ew G_ii_Zven. in-il 1 .r .yisierLZ. EXIT J ;tt疽二三三二二.e 二归二 A-ilv三n七(sv j ;mlw 士 lz (二dmn三.e二三二,二 l:三五 m m F食LimEI食m三I. : ) GiiEwmn二 七曹 = r=7- ?_LEver;T ni.;2.1 f n.yAr; r 5r:?_LVZlT : r.yAent . p 32-3 j.iZveLZ. -ev;;已 已 二三 (ccr-.rtnd . eZ(.LONTIMUZLABZL) j G二iEvht nv = n已h GulEv二二 i.nLLii浮二.CONTZMUZVZ二二I iyAget .pc-.5T3aiLvnT :已w;已Im已 二三 (ccr-.rtnd . eZ r.c reCc.s= ;jLFRE.5EZiAELL) ) ?uiErT 已寸 = n已* ?u iLve t : nuL1, rr. vl nt . 3S j RE.5H_LV三工T);.yAgnT . ps.5T?uE

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!