吉行天下, 力挽狂澜

----------吉豕皮, 力一女共筑----------
随笔 - 35, 文章 - 2, 评论 - 3, 引用 - 0
数据加载中……

Aglet(Mobile Agent)

一、简介

在分散式计算的 域中,有许多解决不同问题的技术,像是我们可以透过 RPC或RMI来使用固定在远端工作站上的函式,并且藉由讯息传递( message-passing)的方式来传送资料,以协调整个分散式计算;也可以利用mobile agents的特性 - 穿梭在网路许多工作站并执行各种特定任务,来做搜寻远端工作站上的目录资讯、更新档案、计算统计资料、或者与其他 agents沟通等工作。目前关於发展後者mobile agents系统的开发平台或执行环境有 Telescript、Agent Tcl、Ara(Agents for Remote Access )、以及Aglet等。

Aglet是由日本IBM 公司所提出,完全用Java发展的 mobile agent技术,并提供实用的平台-Aglets Workbench让我们开发或执行mobile agent系统。 Aglet 这个字是由"agile" 与"applet"两个字所合成的,简单的说就是具有agent行为的Java applet物件。它以执行绪( thread)的型态被产生於一台工作站,可随时暂停执行的工作,而後整个 aglet物件被分派到另一台工作站上,再重新启动执行任务。也因为aglets 是执行绪的型态,所以不会消耗太多的系统资源。以下将为读者介绍Aglet 的系统架构、Aglet 的物件模型( object model)与 packages、以及 Aglets Workbench 的元件。

二、架构

Aglets的系统架构主要分为四个阶段,请参见图1。首先当一个正在执行的 aglet想要将自己外送到远端时,会对 Aglets Runtime层发出请求,然後 Aglets Runtime层把aglet 的状态资讯与程式码转成序列化(serialized )之位元组阵列( byte array );接著若是外送的请求成功时,系统会将 aglet的执行动作结束,然後将位元组阵列传送至ATCI( Agent Transport and Communication Interface)层处理,此层提供使用ATP (Agent Transfer Protocol)的介面,其中ATP为一个简单的应用层协定 ( application-level protocol)(请参见图2),它使得我们不 顾虑aglets是否被派送到不同的 agent系统就可以传送aglets(也就是 agent-system-inde pendent);之後,系统会将位元组阵列附上相关的系统资讯,像是系统名称以及aglet的id等,并以bit stream 透过网路传至远端工作站[1] 。

图一、 Aglet的系统架构下图
图 2. ATP 的示意图
三、API包说明

Aglet系统首先 提供一个「环境」( context)来管理 aglet的基本行为:像是「产生」( create)、「复制」(clone)aglets ,或「分派」( dispatch)aglets 到远端工作站、「召回」(retract)远端的aglets,或「暂停」( deactive)、「唤醒」(active) aglets,以及「移除」(dispose) aglets等,请参见图 3。而aglet与aglet 之间的沟通,可用讯息传递的方式来传递讯息物件( message object)。此外,基於安全上的顾虑,aglets 并非让外界直接存取其资讯,而是透过一个代理者( aglet proxy)提供一致的介面与外界沟通,请参见图4。这样做还有一个好处 - aglet的所在位置会透明化( location transparency),也就是若想要与远端的aglet沟通时,只 在本地主机( local host)的 context上产生对应远端aglet的代理者,并与此代理者沟通即可,不必直接处理网路连线与通讯的问题[1] 。

图 3. Aglet的物件模型
图4. Aglet 基本功能介面

Aglet的packets包括如下:

  • com.ibm.aglet:这个packet定义aglet 的基本元件之类别:Aglet、AgletID 、AgletInfo、 AgletStub、 FutureReply、 Message、ReplySet ,以及介面: AgletContext、 AgletProxy、 MessageManager。
  • com.ibm.aglet.eve nt:Aglet的事件驱动模式分成Clone、 Mobility、 Persistency三种,其中Clone事件产生於复制aglets, Mobility事件产生於分派或取回 aglets等, Persistency事件产生於暂停或唤醒 aglets。
  • com.ibm.aglet.sys tem:主要提供控制 context的介面。
  • com.ibm.aglet.uti l:包括一些常用的物件,像是 AddressBook、 AddressChooser、 ImageData等。
  • com.ibm.agletx.pa tterns:将常用的系统架构design patterns,例如 Master-Slave、 Messenger-Receive r、以及 Notifier-Notifica tion。
四、Aglets Workbench

Aglets Workbench 目前提供的元件包括如下[2] :

  • The Aglets Framework for mobile Java agents: 提供一些特定的mobile agent之元件,以及常用的设计架构。
  • The Agent Transfer Protocol (ATP)
  • JDBC for DB2
  • Tahiti: 视觉化的管理介面,让使用者更方便管理 aglets。
  • Fiji: 它是独立的 package,提供在 web上透过Fiji applets来执行 aglet contexts,以做到产生、分派、召回aglets的功能。
五、范例说明

在此列举一简单之范例(请参见图 5、表 1、表 2):我们在本地工作站上产生一个LocalHost aglet,此aglet会动态产生一个新的 Hello aglet,然後将Hello aglet派送到远端工作站上执行,也就是列印 "Hello!"讯息。

首先说明LocalHost aglet: 在此程式中只有run()这个成员函数,是此aglet 执行绪本身进入执行状态的进入点。接著为了要动态产生一个新的aglet,必须透过 AgletContext来产生,并传回新的 aglet之proxy。然後透过proxy将新的 aglet派送到指定的远端工作站。

然後是Hello aglet : 在这个程式中有 run()和 onCreation()两个成员函数,其中 onCreation()会在本身aglet产生时被执行,先做一些初始化的动作,在此加入 MobilityListener( )这个介面,当有 Mobility事件发生时,即会执行适当的方法(method)。也就是说,若此 Hello aglet被分派时, MobilityListener( )会收到系统产生的 Mobility事件,然後执行 onDispatching()。接著进入run()函式,首先用一个布林变数判断本身是否在本地主机上。若不是则会印出" Hello!"讯息。

图 5. 范例程式的作用关系图


表 1. LocalHost.java

import com.ibm.aglet.*;

import java.net.*;

public class LocalHost extends Aglet{

	public void run(){
		URL codeBase;	//被create的aglet之class path。
		Object init;	//传给被create的aglet之初始物件参数。

	  try{
		// Create Hello aglet并取得其proxy。
		AgletProxy proxy = getAgletContext().createAglet(codeBase,"Hello",init);

	    try{
		proxy.dispatch(new URL("atp://remotehost"));	
		// 分派aglet到远端的主机。
	  } 
     catch(MalformedURLException e){
	     System.out.println(e);	
		 }
	  } 
      catch(Exception e){}

	}
}
										



表 2. Hello.java

import com.ibm.aglet.*;

import java.net.*;

public class LocalHost extends Aglet{

	public void run(){

	   URL codeBase;	//被create的aglet之class path。
       Object init;	//传给被create的aglet之初始物件参数。

	   try{
		// Create Hello aglet并取得其proxy。

		AgletProxy proxy = getAgletContext().createAglet(codeBase,"Hello",init);

    	try{
		proxy.dispatch(new URL("atp://remotehost"));	// 分派aglet到远端的主机。
	  }catch(MalformedURLException e){
	    System.out.println(e);
		}
	  }catch(Exception e){}
	}
}
										
六、参考资料
[1] Mitsuru Oshima and Guenter Karjoth, "Aglets Specification (1. 0)," http://www.trl.ibm.co.jp/aglets/spec_version10.html, May 20th, 1997.
[2] Danny B. Lange and Daniel T. Chang," IBM Aglets Workbench White Paper," http://aglets.trl.ibm.co.jp/documentation.html , September 9, 1996.
[3] Chong Xu and Dongbin Tao, "Building Distributed Application with Aglet," http://www.cs.duke.edu/~chong/aglet/, 1997.
[4] Danny B. Lange and Mitsuru Oshima, "Programming and Deploying Java Mobile Agents with Aglets," ISBN: 0-201-32582-9, 1998.

posted on 2006-11-06 13:31 吉豕皮 阅读(478) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。