移动Agent智能化分布式计算新模型_第1页
移动Agent智能化分布式计算新模型_第2页
移动Agent智能化分布式计算新模型_第3页
移动Agent智能化分布式计算新模型_第4页
移动Agent智能化分布式计算新模型_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、移动 Agent :智能化分布式计算新模型 (第一部分计算机智能化和网络化进程促成了 Agent 技术的迅速崛起和广泛应用, 移动 Agent 技术 是为解决复杂、 动态、 分布式智能应用而提出的一种全新的计算手段, 是计算机软件技术的 又一次深刻变革。本系列文章分两个部分介绍移动 Agent 这一智能化的分布式计算新模型:第一部分对软 件 Agent 和移动 Agent 的一些基本概念作了简要阐述, 提出了基于移动 Agent 的分布式计算 模型,并简明介绍了目前常用的移动 Agent 平台;第二部分以 V oyager 这一移动 Agent 开发 平台为例,讲述如何用 Java 开发移动

2、Agent 应用程序。随着人工智能和计算机网络的飞速发展,特别是近年来 Internet 及其相关技术的普遍应 用, 网络已经成为目前人们发布和获取信息的基本平台。 在这样的背景下, 计算已经不再像 以前那样仅仅局限于网络中的几台服务器上, 而是要求所有计算机都融入到分布式计算这一 大环境中来, 这就引发了分布式计算新一轮的研究热潮, 这期间最引人注目的就是智能软件 Agent 。一、软件 Agent软件 Agent 技术的诞生和发展是人工智能和网络技术相结合的产物。 从 20世纪 60年代 起,传统的人工智能技术开始致力于对知识表达、智能推理、机器学习等领域的研究,这些 研究成果在计算机软件

3、中的应用使得软件有了一定程度上的主动性, 并在自主判断和行为选 择上有了一定的智能性。 目前, 人工智能围绕知识这一中心所进行的研究和应用正在促成知 识工程这一新兴学科的生成, 它涉及到知识的获取、 存储和管理等一系列课题, 对这些问题 的深入研究必将促进软件智能化的进程。在 Internet 这一目前最庞大的互联网络环境中,计算机软件体系结构和组织结构的复杂 性不断增加, 传统的软件设计方法已经无法满足实际需要, 分布式、 智能化才是今后软件发 展的基本方向。 软件分布式的目标是要将问题进行分解, 由多个实现了知识共享的软件模块 或网络节点来共同完成问题求解,而智能化的目标是要在智能主机之间

4、实现智能行为的协 调,两者的结合就产生了软件 Agent 的概念。软件 Agent 技术最早可以追溯到人工智能研究的初期阶段, 1977年 Hewitt 在研究 Concurrent Actor Model时就首次提出了具有自组织性、反应机制和同步执行能力的软件模 型, 这就是最初的软件 Agent 思想。 此后从 70年代末到 90年代初, 科学家都将精力集中于 对软件 Agent 理论的研究, 并从系统的角度提出了一些基本概念。 软件 Agent 的具体实践开 始于 90年代,期间人们进行了一些非常成功的尝试(如 Pleiades , ARCHON 计划等 ,并 对软件 Agent 有了进

5、一步的认识,例如 Microsoft 就认为:“ Agent 是受人委托代表或代替用 户行为,其智能性显示或表现在其优良的判断力或合理的思想。 ”目前软件 Agent 在研究领域中尚没有一个理想的定义,但人们普通认为:软件 Agent 是运行于动态环境的、具有高度自治能力的实体,它能够接受其它实体的委托并为之服务。 不难看出,软件 Agent 首先具有智能特性,它对环境有响应性、自主性和主动性;同时,软 件 Agent 还具有社会特性。对软件 Agent 的完整描述如图 1所示: 图 1. 软件 Agent自治性 (Autonomy 软件 Agent 在运行过程中不直接由人或其它主体控制, 它

6、能 在没有与环境相互作用的情况下自主执行任务,对自己的行为和内部状态有一定的控制权。 自治性是软件 Agent 区别于普通软件程序的基本特征。响应性(Reactivity 软件 Agent 能对来自环境的信息做出适当的响应,它能感知 所处的环境,并能通过自己的行为改变环境。主动性(Proactivity 传统应用程序接受用户指令被动执行,而软件 Agent 不仅 能对环境变化做出反应,而且更重要的是能在特定情况下采取主动行为。推理性(Reasoning 软件 Agent 可根据已有的知识和经验,以理性的方式进行推 理。 软件 Agent 的智能由三个主要部件来完成, 即内部知识库、 自适应能力

7、以及基于知识库 的推理能力。角色(Character 软件 Agent 在社会活动中需要对安全、风险、诚信等因素进行 考虑。通信 /合作 /协调(Communication/Cooperation/Coordination 这是在软件 Agent 群体中应该具有的社会属性。软件 Agent 属于人工智能的范畴, 它在一定程序上模拟了人类社会的行为和关系, 具有 一定的智能并能够自主运行, 向其它软件实体提供相应的服务。 软件 Agent 具有极大的灵活 性和适应性,更加适合于开放、动态的网络环境,也更能体现人类的社会职责。二、移动 Agent随着 Internet 应用的逐步深入, 特别是信息

8、搜索、 分布式计算以及电子商务的蓬勃发展, 人们越来越希望在整个 Internet 范围内获得最佳的服务, 渴望将整个网络虚拟成为一个整体, 使软件 Agent 能够在整个网络中自由移动,移动 Agent 的概念随即孕育而生。20世纪 90年代初, General Magic公司在推出其商业系统 Telescript 时第一次提出了移动 Agent 的概念, 即一个能在异构网络环境中自主地从一台主机迁移到另一台主机, 并可与 其它 Agent 或资源交互的软件实体。移动 Agent 是一类特殊的软件 Agent ,它除了具有软件 Agent 的基本特性自治性、响应性、主动性和推理性外,还具有移

9、动性,即它可以在网 络上从一台主机自主地移动到另一台主机, 代表用户完成指定的任务。 由于移动 Agent 可以 在异构的软、 硬件网络环境中自由移动, 因此这种新的计算模式能有效地降低分布式计算中 的网络负载、 提高通信效率、 动态适应变化了的网络环境, 并具有很好的安全性和容错能力。移动 Agent 可以看成是软件 Agent 技术与分布式计算技术相结合的产物, 它与传统网络 计算模式有着本质上的区别。 移动 Agent 不同于远程过程调用 (RPC , 这是因为移动 Agent 能够不断地从网络中的一个节点移动到另一个节点, 而且这种移动是可以根据自身需要进行 选择的。 移动 Agent

10、 也不同于一般的进程迁移, 因为一般来说进程迁移系统不允许进程自己 选择什么时候迁移以及迁移到哪里, 而移动 Agent 却可以在任意时刻进行移动, 并且可以移 动到它想去的任何地方。移动 Agent 更不同于 Java 语言中的 Applet ,因为 Applet 只能从服 务器向客户机做单方向的移动,而移动 Agent 却可以在客户机和服务器之间进行双向移动。虽然目前不同移动 Agent 系统的体系结构各不相同, 但几乎所有的移动 Agent 系统都包 含移动 Agent (简称 MA 和移动 Agent 服务设施(简称 MAE 两个部分,如图 2所示。 图 2. 移动 Agent 系统M

11、AE 负责为 MA 建立安全、正确的运行环境,为 MA 提供最基本的服务(包括创建、 传输、执行 ,实施针对具体 MA 的约束机制、容错策略、安全控制和通信机制等。 MA 的 移动性和问题求解能力很大程度上取取于 MAE 所提供的服务,一般来讲, MAE 至少应包 括以下基本服务:事务服务 实现移动 Agent 的创建、移动、持久化和执行环境分配;事件服务 包含 Agent 传输协议和 Agent 通信协议, 实现移动 Agent 间的事件传递; 目录服务 提供移动 Agent 的定位信息,形成路由选择;安全服务 提供安全的执行环境;应用服务 提供面向特定任务的服务接口。通常情况下,一个 MA

12、E 只位于网络中的一台主机上,但如果主机间是以高速网络进行 互联的话, 一个 MAE 也可以跨越多台主机而不影响整个系统的运行效率。 MAE 利用 Agent 传输协议(Agent Transfer Protocol, ATP 实现 MA 在主机间的移动,并为其分配执行环境 和服务接口。 MA 在 MAE 中执行,通过 Agent 通信语言(Agent Communication Language, ACL 相互通信并访问 MAE 提供的各种服务。在移动 Agent 系统的体系结构中, MA 可以细分为用户 Agent (User Agent, UA 和服 务 Agent (Server Ag

13、ent, SA 。 UA 可以从一个 MAE 移动到另一个 MAE ,它在 MAE 中执 行, 并通过 ACL 与其它 MA 通信或访问 MAE 提供的服务。 UA 的主要作用是完成用户委托 的任务,它需要实现移动语义、安全控制、与外界的通信等功能。 SA 不具有移动能力,其 主要功能是向本地的 MA 或来访的 MA 提供服务,一个 MAE 上通常驻有多个 SA ,分别提 供不同的服务。由于 SA 是能不移动的,并且只能由它所在 MAE 的管理员启动和管理,这 就保证了 SA 不会是“恶意的” 。 UA 不能直接访问系统资源,只能通过 SA 提供的接口访问 受控的资源, 从而避免恶意 Agen

14、t 对主机的攻击, 这是移动 Agent 系统经常采用的安全策略。移动 Agent 是一个全新的概念, 虽然目前还没有统一的定义, 但它至少具有如下一些基 本特征:身份唯一性移动 Agent 必须具有特定的身份,能够代表用户的意愿。移动自主性移动 Agent 必须可以自主地从一个节点移动到另一个节点, 这是移动 Agent 最基本的特 征,也是它区别与其他 Agent 的标志。运行连续性移动 Agent 必须能够在不同的地址空间中连续运行, 即保持运行的连续性。 具体说来就 是当移动 Agent 转移到另一节点上运行时,其状态必须是在上一节点挂起时那一刻的状态。三、基于移动 Agent 的分布

15、计算模型移动 Agent 天生就具有分布式的特点,一个基于移动 Agent 的应用由一组移动 Agent 构成, 每一个 Agent 根据自身的目标和环境的状况移动到拥有计算所需资源的节点上进行计 算。 在进行计算时可能需要与其它 Agent 进行通信协作, 而整个计算过程则可能会分成多个 步骤进行, 每一步完成之后, 移动 Agent 都将自主地决定下一步的动作, 直至其任务全部完 成后才自动消亡。目前的分布式计算主要采用远程过程调用、进程迁移、 C/S结构等计算模型,这些计算 模型本身都存在一定的局限性,其中最明显的就是要求所有参与计算的节点在进行交互时,都必须同时在网络中存在,如果某些所

16、需资源暂时无法访问到,则整个计算过程将失败。移动 Agent 的出现使得计算机之间的通信不再是一台主机调用位于另一台主机上的服 务, 而是向其它计算机提供可执行的计算过程, 通过网络传送的消息也不再仅仅局限于数据, 而是包含计算过程及其所处状态的计算实体。 在移动 Agent 计算模型中, 计算过程及其相应 状态在接收方计算机中完全代表了发送方的所有请求, 因此在这种情况下网络的可靠性变得 不再那么重要,这是因为:移动 Agent 无需消耗过多的网络带宽,它仅仅在移动时使用带宽;移动 Agent 在移动后将继续执行,即使此时已经失去了与创建者之间的网络连接。采用移动 Agent 技术能够较大地

17、减轻网络负载, 目前的分布式系统通常过多地依赖于网 络通信协议,这些协议在完成任务的过程中需要进行多次交互,从而很容易导致网络拥塞, 如图 3所示。 图 3. 传统方式移动 Agent 可以封装一个完整的会话过程,然后自主移动到目的主机上去进行本地交 互,如图 4所示。此外,当远程主机需要进行数据处理时,采用移动 Agent 还可以避免大量 数据在网络上的传输, 其基本思路是将计算移到数据上去进行, 而不是把数据移到计算中来。 图 4. 移动 Agent 方式因此, 如果一个客户机需要与网络上特定服务器进行大量的通信, 最好的办法就是实现 一个使用移动 Agent 的系统, 该 Agent 能

18、够自动移动到远程服务器上, 执行计算任务并返回, 这样可以减少网络拥塞。整个计算过程中客户机没有必要在网络中存在,仅仅只有在移动 Agent 返回时,客户机才需要连接到网络上,如图 5所示。移动Agent 返回MAE MAE 服务程序 客户程序 MAE 断开网络连接 MAE 服务程序客户程序 MAE MAE 派遣移动Agent 服务程序 客户程序 图5. 移动Agent 计算模型移动Agent 技术给分布式系统的设计、实现和维护都带来了新的活力,它有着许多传统分布式计算模型无法比拟的优势:第一,移动Agent 能较大地减轻网络上的数据流量通过将服务请求Agent 移动到目标主机,使得移动Age

19、nt 可以直接访问该主机上的资源,与源主机间的交互变少,避免了大量数据在网络中的传输,从而降低了整个系统对网络带宽的依赖,缩短了通信时延,提高了服务质量。第二,移动Agent 能以异步的方式自主运行可以将要完成的任务封装到移动Agent 中,并通过网络将其派遣出去,然后就可以断开源主机与目标主机之间的连接。此后,移动Agent 就独立于生成它的进程,并可异步自主操作了。源主机可以在随后适当的时候再与目标主机连接并接收计算结果。这对今后移动设备或移动用户来说尤其有用,因为目前移动设备上的计算皆依赖于昂贵而脆弱的网络连接,它要求在移动设备和固定网络之间建立持续的连接,这种要求无论从经济角度和技术角

20、度来讲都是不十分理想的。第三,移动Agent具有较强的应变能力移动Agent能够感知其运行环境,并对环境变化作出适当的反应,它可以根据服务器和网络的负载动态决定移动目标,有利于负载均衡。此外,移动Agent的智能路由还减少了用户在浏览或搜寻时所做的判断。第四,移动Agent有利于并行处理移动Agent在进行任务处理时可以动态创建多个Agent并行工作,提高效率并降低作业的响应时间。多移动Agent拥有在网络主机之间动态合理分布自身的独特能力,能够按一定规则来维持解决某个特定问题的最优配置。第五,移动Agent具有天然的异构性分布式网络计算平台往往是异构的,而移动Agent通常独立于特定的软硬件

21、环境,仅仅依赖于其运行环境,所以移动Agent是进行无缝系统集成的最优条件。第六,移动Agent具有很强的健壮性和容错能力移动Agent具有对非预期状态和事件的应变能力,这使得构建健壮和容错性好的分布式系统变得相对容易,当一台主机关闭时,所有正在该主机上运行的移动Agent会得到警告,并有充足的时间移动到另一台主机上并继续运行。总之,在网络逐步走向一体化的时代,移动Agent技术较之于传统的分布式技术有着非常明显的优势。四、典型移动Agent系统移动Agent目前已经从理论探索进入到实用阶段,涌现出了一系列较为成熟的开发平台和执行环境。理论上移动Agent可以用任何语言编写(如C/C+、Jav

22、a、Perl、Tcl和Python 等,并可在任何机器上运行,但考虑到移动Agent本身需要对不同的软硬件环境进行支持,所以最好还是选择在一个解释性的、独立于具体语言的平台上开发移动Agent。Java是目前开发移动Agent的一门理想语言,因为经过编译后的Java二进制代码可以在任何具有Java 解释器的系统上运行,具有很好的跨平台特性。移动Agent技术虽然已经研究了很多年,但直到1996年才出现了真正实用的移动Agent 系统,目前使用的移动Agent系统大致可以分为三类:一类是基于传统解释语言的,一类是基于Java语言的,另一类则是基于CORBA平台的。下面介绍几个典型的移动Agent

23、系统,它们代表了当今移动Agent技术的基本方向和潮流:General Magic公司的Odysses作为移动Agent系统专用语言的最早尝试,General Magic公司开发的Telescript曾经在过去的几年里被广泛采用。Telescript是一种面向对象的解释性语言,用它编写的移动Agent 在通信时可以采用两种方式:若在同一场所运行,Agent间可以相互调用彼此的方法;若在不同场所运行,Agent间需要建立连接,互相传递可计算的移动对象。Telescript在开始出现时还是一个比较成功的移动Agent开发平台,其安全性和健壮性都比较好,执行效率也很高, Telescriipt中的三

24、个基本概念(agent、place和go对移动Agent做了一个很精辟的阐述:代理自主移动(agent go place。随着Java的迅速崛起及其跨平台特性的逐步完善,Telescript的优势慢慢消失,General Magic公司开始改变其策略,开发了一个完全用Java实现的移动Agent系统Odyssey,它能够支持Java RMI,Microsoft DCOM,以及CORBA IIOP。Odyssey继承了Telescript中的许多特性,是目前被广泛使用的一个移动Agent开发平台。IBM公司的AgletAglet是最早基于Java的移动Agent开发平台之一,Aglet的名字来源

25、于Agent和Applet,可以简单地将其看成具有Agent行为的Applet对象。Aglet以线程的形式产生于一台机器,需要时可以随时暂停正在执行的工作,并将整个Aglet分派到另一台机器上,然后继续执行尚未完成的任务。从概念上讲,一个Aglet就是一个移动Java对象,它支持自动运行的思想,可以从一个基于Aglet的主机移动到其它支持Aglet的主机上。Aglet构造了一个简单而全面的移动Agent编程框架,为移动Agent之间的通信提供了动态而有效的交互机制,同时还具备一整套详细而易用的安全机制,这一切使得移动Agent 的开发变得相对简单起来。Recursion公司的VoyagerV

26、oyager可以看成是一个增强了的对象请求代理(ORB,同其它移动Agent系统相比, V oyager与Java语言的结合更加紧密,既可用于开发移动Agent系统,也可用于创建传统的分布式系统。V oyager是一个纯Java分布式计算平台,可用来迅速生成高性能分布式应用程序,是代表当前技术水平的一个优秀的移动Agent开发平台。移动Agent:智能化分布式计算新模型(第二部分在本系统文章的第一部分中,你已经大致了解了移动Agent这一新的分布式计算新模型,目前移动Agent技术已经走出了实验室,开始真正进入实际应用。在这一部分中,你将掌握如何在V oyager平台上开发移动Agent应用程

27、序。五、Voyager移动代理编程Java是目前开发移动Agent的最佳语言,Recursion公司开发的V oyager是一个高效的移动Agent支持平台,可以用来迅速、便捷地开发基于移动Agent的高性能分布式应用程序,5.1 Voyager的启动和终止安装好V oyager软件包后,可以从命令行方式启动V oyager服务器,接受来自V oyager 程序的移动Agent对象和消息。例如,要在端口8000上启动V oyager服务器,可以使用如下命令:garygary gary$ voyager 8000如果一切正常,将显示如下信息:voyager orb professional 4.

28、6, copyright recursion software 1997-2003 在命令行方式下终止V oyager服务器,可以按Ctrl+C键。启动和终止V oyager的另一个方法是调用V oyager提供的API。要在Java程序中启动V oyager,可以调用V oyager.startup(函数,以下是启动V oyager的一些常用方法:V oyager.startup( / 启动V oyagerV oyager.startup(8000 / 在端口8000上启动V oyagerV oyager.startup("/gary:8000" / 在主机gary的80

29、00端口启动V oyager 在Java程序中终止V oyager的方法是调用V oyager.shutdown(函数。5.2 Voyager应用程序框架在借助V oyager平台开发移动Agent应用程序时,通常需要遵循以下几个基本步骤:1. 定义远程接口2. 实现远程接口3. 开发使用远程接口的客户程序4. 启动V oyager服务器5. 运行V oyager客户机假设要开发一个很简单的V oyager服务程序,用于实现两个整数的相加,V oyager客户通过派遣一个Agent到服务端,完成对所携带的两个整数的相加,并将计算结果由移动Agent 带回到客户机。下面借助V oyager提供的

30、开发平台来实现这一移动Agent应用程序,从中不难得出V oyager应用程序的基本框架。步骤一、定义远程接口V oyager的远程接口与Java的RMI类似,由一系列声明构成。Java语言提供的接口机制使分布式计算变得可能,许多分布式计算模型(包括移动Agent都利用接口来简化分布式应用程序开发的复杂度。V oyager中的远程对象由移动Agent来表征,正是由于Agent具有与远程对象相同的接口,才使得一个接口类型的变量有可能通过Agent来引用远程对象。V oyager中的接口名一般以字母I开头,建议在使用V oyager开发移动Agent应用程序时尽量遵循这一规则。在本例中用到的远程接

31、口名为ICalculator,该接口中只定义了一个名为add的方法,其功能是完成两个整数的相加,并返回计算结果,如例1所示:例1. ICalculator.java/* (# ICalculator.java*/ 远程计算接口public interface ICalculatorint add(int a, int b;步骤二、实现远程接口使用V oyager开发移动Agent应用程序的第二步是实现上面定义的远程接口,在本例中就是要编写一个实现了ICalculator接口的类Calculator,如例2所示:例2. Calculator.java/* (# Calculator.java*/

32、public class Calculator implements ICalculator, Serializablepublic Calculator( / 远程计算接口的实现public int add(int a, int b int result;result = a + b;return result;除了实现ICalculator接口外,Calculator类还实现了Serializable接口,这是因为V oyager 同RMI一样要实现对象的迁移,需要借助Java语言中对象的序列化机制。步骤三、开发客户机在定义并实现远程接口之后,接下去要做的就是开发使用远程接口的V oyag

33、er客户程序。例3是一个简单的V oyager客户机实现代码:例3. CalcClient.java/* (# CalcClient.java*/public class CalcClientpublic static void main(String args ICalculator calcObj;int a = 1, b = 3;int result;try / 启动V oyagerV oyager.startup(;/ 创建远程计算对象calcObj =(ICalculator Factory.create("Calculator", "/gary:800

34、0"/ 向远程对象发送消息result = calcObj.add(a, b;/ 关闭V oyagerV oyager.shutdown(; catch(Exception exception 客户端的代码比较简单,值得注意的是如何在Java程序中启动V oyager作为客户机,以及如何使用Factory.create(来创建远程对象。通过调用Factory类的create(方法,可以在特定位置上创建对象,该方法返回新建对象的远程代理,如果该代理目前还不存在则被自动创建。create(方法有多种形式,分别用来创建本地对象和远程对象。例如,要在本地程序中创建一个名为Calculator

35、类的实例,可以调用如下的代码:ICalculator calcObj = (ICalculator Factory.create("Calculator"与之对应,如果想在一个远端V oyager程序中创建一个名为Calculator类的实例,假设该程序运行在主机gary的8000端口上,则可以调用如下的代码:ICalculator calcObj =(ICalculator Factory.create("Calculator", "/gary:8000"步骤四、启动Voyager服务器要对开发的V oyager应用程序进行测试,首

36、先需要在服务器端以命令行方式启动V oyager,根据本例中客户程序的具体要求,监听端口应该设为8000:garygary gary$ voyager 8000步骤五、运行Voyager客户机一切准备就绪,现在可以在客户端执行下面的命令来启动V oyager客户机程序了:maggiemaggie maggie$ java CalcClient如果客户机运行正常,Calculator构造函数中的输出信息将显示在V oyager服务器上,而计算结果则将显示在V oyager客户机上。5.3 Voyager对象的移动性可移动性是移动Agent区别于其它软件Agent的本质特征,在V oyager中移

37、动对象到新的位置非常简单,只需要遵循下面两个步骤:1. 调用Mobility.of(方法得到可移动对象;2. 调用IMobility接口中的moveTo(方法移动对象;在调用moveTo(方法移动V oyager对象时,可移动对象将按以下步骤顺序执行任务:a. 对象中正在处理的消息将完成,但新发送给对象的所有消息都将暂停执行;b. 对象及其状态都将使用Java的序列化机制复制到新位置,如果无法完成序列化或者网络出现故障,则抛出异常;c. 对象的新地址在原位置处被存储,存储的新地址不会被垃圾回收器当成对象引用;d. 旧对象被销毁;e. 在旧对象上挂起的消息重新执行;f. 当消息通过代理传送给对象

38、的旧地址时,将向代理抛出一个包含对象新地址的异常。代理捕获该异常后绑定新的对象地址,重新向对象的新地址发送消息;g. 如果对象移动成功,moveTo(方法将返回;如果对象移动失败,则异常将被抛出,同时对象恢复到原状态;下面以一个简单的问候程序来演示在V oyager中移动对象,该程序将创建一个对象,然后移动到其它机器上输出问候信息。按照V oyager应用程序基本框架的要求,首先定义远程接口IMessage,如例4所示:例4. IMessage.java/* (# IMessage.java*/ 远程接口public interface IMessagevoid showMessage(Str

39、ing msg;接着实现IMessage接口,如例5所示:例5. Message.java/* (# Message.java*/ 远程接口实现public class Message implements IMessage, Serializablepublic void showMessage(String msg 同样,Message类除了实现IMessage接口外,还实现了Serializable接口,这是因为对象移动同样需要用到Java的序列化机制。V oyager中的每个可移动对象都必须实现Serializable接口,否则在移动过程中将产生异常。接下去就能够编写相应的V oyag

40、er客户机代码来实现对象的移动了,如例6所示:例6. Action.java/* (# Action.java*/public class Actionpublic static void main(String argv try / 在9000端口启动V oyagerV oyager.startup("9000"IMessage message =(IMessage Factory.create("Message"IMobility mob =Mobility.of(message;/ 移动Agent到远程计算机mob.moveTo("/ga

41、ry:7000"message.showMessage("Hello World!"/ 关闭V oyagerV oyager.shutdown(; catch (Exception e 现在可以对V oyager对象的移动性进行测试了,首先在主机gary的7000端口上启动V oyager服务器:garygary gary$ voyager 7000然后在另一台主机上运行V oyager客户机:maggiemaggie maggie$ java ActionAction类首先在本机的9000端口上启动V oyager,然后调用Factory.create(方法创建

42、名为Message的类实例,接着用Mobility.of(方法将其转变成可移动对象,并调用moveTo(方法将其移动到主机gary的 7000端口上去。对象成功移动之后,整个运行环境将随之发生变化,输出信息此时自然也就显示在远程主机上。在V oyager中,对象的移动对客户机来讲是透明的,但客户机对移动对象的引用始终都是有效的,无论该对象是位于本地主机、远程主机或者正处于移动过程之中。5.4 Voyager移动Agent 开发使用V oyager可以很容易地开发移动Agent应用程序,V oyaer中的移动代理由一个或多个可移动对象组成,在V oyager中开发移动Agent需要遵循下面两个步

43、骤:1. 调用Agent.of(方法将V oyager对象转变成移动Agent;2. 调用IAgent接口中定义的方法实施移动Agent行为;在利用V oyager开发移动Agent应用时,经常需要用到IAgent接口中定义的如下方法:moveTo(将Agent移动到指定位置。setAutonomous(设置移动Agent的自主状态,当移动Agent处于自主状态时,即使此时没有任何指向移动Agent的引用存在,垃圾收集程序也不会将其收回。移动Agent默认的自主状态为true,当移动Agent完成任务并希望被收回,可以调用setAutonomous(false。isAutonomous(返回移

44、动Agent当前的自主状态。getHome(返回移动代理当前所处位置的URL。下面通过一个简单的例子来演示如何使用V oyager开发移动Agent应用程序,服务器端仍使用两整数相加的程序,同时开发一个加法器移动Agent,它可以自主移动到远程服务器上执行相加操作。首先依然是定义两个整数相加的远程接口ICalculator,如例7所示:例7. ICalculator.java/* (# ICalculator.java*/ 远程接口public interface ICalculatorint add(int a, int b;ICalculator接口中只有一个名为add的方法,该接口的具体

45、实现Calculator如例8所示:例8. Calculator.java/* (# Calculator.java*/public class Calculator implements ICalculator, Serializablepublic Calculator( / 实现远程计算接口public int add(int a, int b int result;result = a + b;return result;现在需要一个能移动到远程计算机上完成计算过程的移动Agent,先来编写相应的接口IAdder,如例9所示:例9. IAdder.java/* (# IAdder.ja

46、va*/ 移动Agent的接口public interface IAddervoid setOP1(int op;void setOP2(int op;void work(ICalculator calc;void atMachine(ICalculator calc;接口IAdder中定义了名为work和atMachine的两个方法,它们均使用ICalculator接口作为参数,例10是IAdder接口的具体实现:例10. Adder.java/* (# Adder.java*/ 移动Agent接口的实现public class Adder implements IAdder, Serial

47、izableprivate int op1;private int op2;private int result;public Adder( public void finalize( / 设置第一个操作数public void setOP1(int op op1 = op;/ 设置第二个操作数public void setOP2(int op op2 = op;/ 实现Agent的移动public void work(ICalculator calc try Agent.of(this.moveTo(calc, "atMachine" catch (Exception e

48、 / 完成移动Agent的计算public void atMachine(ICalculator calc / 输出Agent来自的主机名+ Agent.of(this.getHome(;+ op1 + " + " + op2 + " = " + compute(calc;/ 设置自主状态Agent.of(this.setAutonomous(false;/ 计算方法public int compute(ICalculator calc return calc.add(op1, op2;因为要使用Java的序列化机制来实现对象的移动,因此Adder除了实

49、现IAdder接口外,还实现了Serializable接口。Adder类的核心是work(方法,在与远程主机上的V oyager服务程序建立起通信后,Addre类将移动到远端服务器上。当移动Agent成功到达V oyager服务器后,atMachine(方法将在远端服务器上被执行,完成用户指派的计算任务。移动Agent在完成任务后调用setAutonomous(方法对自主状态进行设置,从而使得Adder对象可以被垃圾收集程序收回。要测试移动代理Adder,需要编写一个主程序来生成本地和远程主机上的对象,如例11所示:例11. MyAgent.java/* (# MyAgent.java*/ 移

50、动Agent的用户界面public class MyAgent extends JFrame implements ActionListenerprivate ICalculator calc;private IAdder adder;private JButton btnStartup = new JButton("Startup"private JButton btnCompute = new JButton("Compute"private JButton btnShutdown = new JButton("Shutdown"

51、private JTextArea edtStatus = new JTextArea(10, 20;private JTextField edtOP1 = new JTextField(10;private JLabel lblPlus = new JLabel(" + "private JTextField edtOP2 = new JTextField(10;public MyAgent( super("Mobile Agent demo"JPanel pane =new JPanel(;JPanel opane =new JPanel(;Grid

52、BagConstraints constraints =new GridBagConstraints(;GridBagLayout layout =new GridBagLayout(;JScrollPane scroll =new JScrollPane(edtStatus,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;/ 按钮的事件响应函数btnStartup.addActionListener(this;btnCompute.addActionLi

53、stener(this;btnShutdown.addActionListener(this;/ 界面布局pane.setLayout(layout;/ 输入框opane =new JPanel(;opane.add(edtOP1;opane.add(lblPlus;opane.add(edtOP2;buildConstraints(constraints, 0, 0, 1, 1, 100, 100;pane.add(opane;layout.setConstraints(opane, constraints;/ 状态区域buildConstraints(constraints, 0, 1,

54、1, 5, 100, 100;edtStatus.setEditable(false;edtStatus.append("Agent Status:n"pane.add(scroll;layout.setConstraints(scroll, constraints;/ 开始按钮buildConstraints(constraints, 1, 1, 1, 1, 100, 100;layout.setConstraints(btnStartup, constraints;pane.add(btnStartup;/ 计算按钮buildConstraints(constraints, 1, 2, 1, 1, 100, 100;layout.setConstraints(btnCompute, constraints;btnCompute.setEnabled(false;pane.add(btnCompute;/ 关闭按钮buildConstraints(constraints, 1, 3, 1, 1, 100, 100;layout.setConstraints(btnShutdown, constraints;btnShutdown.setEnabled(false;pane.add(btnShutdown;setC

温馨提示

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

评论

0/150

提交评论