?? 0090.htm
字號(hào):
<html>
<head>
<title>新時(shí)代軟件教程:操作系統(tǒng) 主頁(yè)制作 服務(wù)器 設(shè)計(jì)軟件 網(wǎng)絡(luò)技術(shù) 編程語(yǔ)言 文字編輯</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>Aglet(Mobile Agent) </strong></big></p>
<div align="right">---(文/王靜翊)</div>
<TABLE width="90%">
<TBODY>
<TR>
<TD class=page><A name=one>一、簡(jiǎn)介</A> <BR>
<P>在分散式計(jì)算的 域中,有許多解決不同問(wèn)題的技術(shù),像是我們可以透過(guò) RPC或RMI來(lái)使用固定在遠(yuǎn)端工作站上的函式,并且藉由訊息傳遞(
message-passing)的方式來(lái)傳送資料,以協(xié)調(diào)整個(gè)分散式計(jì)算;也可以利用mobile agents的特性 -
穿梭在網(wǎng)路許多工作站并執(zhí)行各種特定任務(wù),來(lái)做搜尋遠(yuǎn)端工作站上的目錄資訊、更新檔案、計(jì)算統(tǒng)計(jì)資料、或者與其他
agents溝通等工作。目前關(guān)於發(fā)展後者mobile agents系統(tǒng)的開發(fā)平臺(tái)或執(zhí)行環(huán)境有 Telescript、Agent
Tcl、Ara(Agents for Remote Access )、以及Aglet等。 </P>
<P>Aglet是由日本IBM 公司所提出,完全用Java發(fā)展的 mobile agent技術(shù),并提供實(shí)用的平臺(tái)-Aglets
Workbench讓我們開發(fā)或執(zhí)行mobile agent系統(tǒng)。 Aglet 這個(gè)字是由"agile"
與"applet"兩個(gè)字所合成的,簡(jiǎn)單的說(shuō)就是具有agent行為的Java applet物件。它以執(zhí)行緒(
thread)的型態(tài)被產(chǎn)生於一臺(tái)工作站,可隨時(shí)暫停執(zhí)行的工作,而後整個(gè) aglet物件被分派到另一臺(tái)工作站上,再重新啟動(dòng)執(zhí)行任務(wù)。也因?yàn)閍glets
是執(zhí)行緒的型態(tài),所以不會(huì)消耗太多的系統(tǒng)資源。以下將為讀者介紹Aglet 的系統(tǒng)架構(gòu)、Aglet 的物件模型( object model)與
packages、以及 Aglets Workbench 的元件。 </P><A name=two>二、架構(gòu)</A> <BR>
<P>Aglets的系統(tǒng)架構(gòu)主要分為四個(gè)階段,請(qǐng)參見圖1。首先當(dāng)一個(gè)正在執(zhí)行的 aglet想要將自己外送到遠(yuǎn)端時(shí),會(huì)對(duì) Aglets
Runtime層發(fā)出請(qǐng)求,然後 Aglets Runtime層把a(bǔ)glet 的狀態(tài)資訊與程式碼轉(zhuǎn)成序列化(serialized )之位元組陣列(
byte array );接著若是外送的請(qǐng)求成功時(shí),系統(tǒng)會(huì)將 aglet的執(zhí)行動(dòng)作結(jié)束,然後將位元組陣列傳送至ATCI( Agent
Transport and Communication Interface)層處理,此層提供使用ATP (Agent Transfer
Protocol)的介面,其中ATP為一個(gè)簡(jiǎn)單的應(yīng)用層協(xié)定 ( application-level
protocol)(請(qǐng)參見圖2),它使得我們不 顧慮aglets是否被派送到不同的 agent系統(tǒng)就可以傳送aglets(也就是
agent-system-inde pendent);之後,系統(tǒng)會(huì)將位元組陣列附上相關(guān)的系統(tǒng)資訊,像是系統(tǒng)名稱以及aglet的id等,并以bit
stream 透過(guò)網(wǎng)路傳至遠(yuǎn)端工作站[1] 。 </P>
<TABLE>
<TBODY>
<TR>
<TD><IMG src="images/aglet_f1.gif"> </TD></TR>
<TR>
<TD>
<CENTER>圖一、 Aglet的系統(tǒng)架構(gòu)下圖</CENTER></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD><IMG src="images/aglet_f2.gif"> </TD></TR>
<TR>
<TD>
<CENTER>圖 2. ATP 的示意圖</CENTER></TD></TR></TBODY></TABLE><A
name=three>三、API包說(shuō)明</A> <BR>
<P>Aglet系統(tǒng)首先 提供一個(gè)「環(huán)境」( context)來(lái)管理 aglet的基本行為:像是「產(chǎn)生」(
create)、「復(fù)制」(clone)aglets ,或「分派」( dispatch)aglets
到遠(yuǎn)端工作站、「召回」(retract)遠(yuǎn)端的aglets,或「暫?!梗?deactive)、「喚醒」(active)
aglets,以及「移除」(dispose) aglets等,請(qǐng)參見圖 3。而aglet與aglet 之間的溝通,可用訊息傳遞的方式來(lái)傳遞訊息物件(
message object)。此外,基於安全上的顧慮,aglets 并非讓外界直接存取其資訊,而是透過(guò)一個(gè)代理者( aglet
proxy)提供一致的介面與外界溝通,請(qǐng)參見圖4。這樣做還有一個(gè)好處 - aglet的所在位置會(huì)透明化( location
transparency),也就是若想要與遠(yuǎn)端的aglet溝通時(shí),只 在本地主機(jī)( local host)的
context上產(chǎn)生對(duì)應(yīng)遠(yuǎn)端aglet的代理者,并與此代理者溝通即可,不必直接處理網(wǎng)路連線與通訊的問(wèn)題[1] 。 </P>
<TABLE>
<TBODY>
<TR>
<TD><IMG src="images/aglet_f3.gif"> </TD></TR>
<TR>
<TD>
<CENTER>圖 3. Aglet的物件模型 </CENTER></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD><IMG src="images/aglet_f4.gif"> </TD></TR>
<TR>
<TD>
<CENTER>圖4. Aglet 基本功能介面</CENTER></TD></TR></TBODY></TABLE>
<P>Aglet的packets包括如下: </P>
<UL>
<LI>com.ibm.aglet:這個(gè)packet定義aglet 的基本元件之類別:Aglet、AgletID 、AgletInfo、
AgletStub、 FutureReply、 Message、ReplySet ,以及介面: AgletContext、
AgletProxy、 MessageManager。 </LI></UL>
<UL>
<LI>com.ibm.aglet.eve nt:Aglet的事件驅(qū)動(dòng)模式分成Clone、 Mobility、
Persistency三種,其中Clone事件產(chǎn)生於復(fù)制aglets, Mobility事件產(chǎn)生於分派或取回 aglets等,
Persistency事件產(chǎn)生於暫停或喚醒 aglets。 </LI></UL>
<UL>
<LI>com.ibm.aglet.sys tem:主要提供控制 context的介面。 </LI></UL>
<UL>
<LI>com.ibm.aglet.uti l:包括一些常用的物件,像是 AddressBook、 AddressChooser、
ImageData等。 </LI></UL>
<UL>
<LI>com.ibm.agletx.pa tterns:將常用的系統(tǒng)架構(gòu)design patterns,例如 Master-Slave、
Messenger-Receive r、以及 Notifier-Notifica tion。 </LI></UL><A
name=four>四、Aglets Workbench</A> <BR>
<P>Aglets Workbench 目前提供的元件包括如下[2] : </P>
<UL>
<LI>The Aglets Framework for mobile Java agents: 提供一些特定的mobile
agent之元件,以及常用的設(shè)計(jì)架構(gòu)。 </LI></UL>
<UL>
<LI>The Agent Transfer Protocol (ATP) </LI></UL>
<UL>
<LI>JDBC for DB2 </LI></UL>
<UL>
<LI>Tahiti: 視覺化的管理介面,讓使用者更方便管理 aglets。 </LI></UL>
<UL>
<LI>Fiji: 它是獨(dú)立的 package,提供在 web上透過(guò)Fiji applets來(lái)執(zhí)行 aglet
contexts,以做到產(chǎn)生、分派、召回aglets的功能。 </LI></UL><A name=five>五、范例說(shuō)明</A> <BR>
<P>在此列舉一簡(jiǎn)單之范例(請(qǐng)參見圖 5、表 1、表 2):我們?cè)诒镜毓ぷ髡旧袭a(chǎn)生一個(gè)LocalHost aglet,此aglet會(huì)動(dòng)態(tài)產(chǎn)生一個(gè)新的
Hello aglet,然後將Hello aglet派送到遠(yuǎn)端工作站上執(zhí)行,也就是列印 "Hello!"訊息。 </P>
<P>首先說(shuō)明LocalHost aglet: 在此程式中只有run()這個(gè)成員函數(shù),是此aglet
執(zhí)行緒本身進(jìn)入執(zhí)行狀態(tài)的進(jìn)入點(diǎn)。接著為了要?jiǎng)討B(tài)產(chǎn)生一個(gè)新的aglet,必須透過(guò) AgletContext來(lái)產(chǎn)生,并傳回新的
aglet之proxy。然後透過(guò)proxy將新的 aglet派送到指定的遠(yuǎn)端工作站。 </P>
<P>然後是Hello aglet : 在這個(gè)程式中有 run()和 onCreation()兩個(gè)成員函數(shù),其中
onCreation()會(huì)在本身aglet產(chǎn)生時(shí)被執(zhí)行,先做一些初始化的動(dòng)作,在此加入 MobilityListener( )這個(gè)介面,當(dāng)有
Mobility事件發(fā)生時(shí),即會(huì)執(zhí)行適當(dāng)?shù)姆椒ǎ╩ethod)。也就是說(shuō),若此 Hello aglet被分派時(shí), MobilityListener(
)會(huì)收到系統(tǒng)產(chǎn)生的 Mobility事件,然後執(zhí)行
onDispatching()。接著進(jìn)入run()函式,首先用一個(gè)布林變數(shù)判斷本身是否在本地主機(jī)上。若不是則會(huì)印出" Hello!"訊息。 </P>
<TABLE>
<TBODY>
<TR>
<TD><IMG src="images/aglet_f5.gif"> </TD></TR>
<TR>
<TD>
<CENTER>圖 5. 范例程式的作用關(guān)系圖</CENTER></TD></TR></TBODY></TABLE><BR><BR><B>表 1.
LocalHost.java</B> <BR><BR>
<P align=center>
<TABLE width="90%">
<TBODY>
<TR>
<TD class=page><PRE>
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之初始物件參數(shù)。
try{
// Create Hello aglet并取得其proxy。
AgletProxy proxy = getAgletContext().createAglet(codeBase,"Hello",init);
try{
proxy.dispatch(new URL("atp://remotehost"));
// 分派aglet到遠(yuǎn)端的主機(jī)。
}
catch(MalformedURLException e){
System.out.println(e);
}
}
catch(Exception e){}
}
}
</PRE></TD></TR></TBODY></TABLE></P><PRE></PRE><BR><BR><BR><B>表 2. Hello.java</B> <BR><BR>
<P align=center>
<TABLE width="90%">
<TBODY>
<TR>
<TD class=page><PRE>
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之初始物件參數(shù)。
try{
// Create Hello aglet并取得其proxy。
AgletProxy proxy = getAgletContext().createAglet(codeBase,"Hello",init);
try{
proxy.dispatch(new URL("atp://remotehost")); // 分派aglet到遠(yuǎn)端的主機(jī)。
}catch(MalformedURLException e){
System.out.println(e);
}
}catch(Exception e){}
}
}
</PRE></TD></TR></TBODY></TABLE></P><PRE></PRE><A name=six>六、參考資料</A>
<DL>
<DT>
<DD><A name=1>[1]</A> Mitsuru Oshima and Guenter Karjoth, "Aglets
Specification (1. 0)," <A
href="../../www.trl.ibm.co.jp/aglets/spec_version10.html">http://www.trl.ibm.co.jp/aglets/spec_version10.html</A>,
May 20th, 1997.
<DD><A name=2>[2]</A> Danny B. Lange and Daniel T. Chang," IBM Aglets
Workbench White Paper," <A
href="../../aglets.trl.ibm.co.jp/documentation.html">http://aglets.trl.ibm.co.jp/documentation.html</A>
, September 9, 1996.
<DD><A name=3>[3]</A> Chong Xu and Dongbin Tao, "Building Distributed
Application with Aglet," <A
href="../../www.cs.duke.edu/~chong/aglet/default.htm">http://www.cs.duke.edu/~chong/aglet/</A>,
1997.
<DD><A name=4>[4]</A> Danny B. Lange and Mitsuru Oshima, "Programming
and Deploying Java Mobile Agents with Aglets," ISBN: 0-201-32582-9,
1998. </DD></DL></TD></TR></TBODY></TABLE>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -