一、概述
JavaSpaces是一種Java術語。JavaSpaces技術是進行分散式計算的一種簡單機制,在分散式計算應用程式中,JavaSpaces 提供了對象的提供者和請求者可用來方便地進行通信的共享虛擬空間,這允許以Java對象的形式對任務、請求和信息進行簡單的交換。Javaspaces提供了永久地建立和保存對象的能力,Javaspaces是建立在Jini之上的一種技術,它作為一種共享分散式通信的機制,還可作為一種存儲對象的機制;JavaSpaces是一種Jini技術服務,這表示使用Javaspaces的開發人員也可以利用各種Jini服務比如說利用事務處理和通知等。JavaSpaces以一種非常簡單的接口提供了這些功能,但是,有效地利用這種簡單的接口需要大量的概念和工具。在分散式系統中,對象之間應當能夠相互通信、共享信息。JavaSpace服務(JavaSpace service)利用對象的分散式存儲(distributed repository)和三個簡單操作(讀、寫和取),實現了一個簡單的、構建分散式系統的高層體系結構。JavaSpace服務通過Jini事務管理器和通知機制來支持事務,當與某個給定模板相匹配的條目寫入JavaSpace服務時,通知機制能夠通知某個對象。
二、JavaSpaces 概念及特性
1、JavaSpaces 概念
可以從以下幾個方面來理解JavaSpace概念:純對象風格;作為Jini服務;具有共享分散式通信的機制; 對象存儲機制。從純對象的觀點,所有JavaSpace都是我們所說的JavaSpace接口的實現。它確實是得出那些有趣結果的一個非常小的接口。從Jini的觀點來看,JavaSpace是一個利用Jini基礎結構並向其他Jini客戶機和服務提供其功能的一個Jini服務。
JavaSpaces提供了一種完成共享分散式計算的機制。這可能是它所提供的一種最重要的功能了。JavaSpaces還提供了一個非常有趣且簡單的對象存儲機制。這並不是說它們是一種對象資料庫,但這確實是一個非常有用的功能。
2、JavaSpace服務
JavaSpace服務為Java對象提供分散式的共享存儲器。任何與Java兼容的客戶端都可以將共享對象放進這個存儲器中。然而,對於這些Java對象有幾個限制條件。首先,保存在JavaSpace服務的對象都必須實現接口Entry(在net.jini.core.entry軟體包中)。JavaSpace服務Entry附加到Jini Entry的方式定義在Jini核心規範中。一個Entry對象能夠有多個構造函式並需要相當數量的方法。其他的需求包括一個public的無參數的構造函式、public欄位和非基本數據類型的欄位。JavaSpace服務代理使用無參數的構造函式在反串性化過程中實例化匹配的Entry對象。所有的用於模板對Entry對象進行匹配的欄位都必須是public的。Jini核心規範中定義,一個Entry對象不能包含基本數據類型的欄位。這個對象類型的欄位要求簡化了匹配的模板模型,因為基本的數據類型不能有null值,該值在模板中作為通配符。
同Jini一樣,JavaSpace技術需要幾個底層的服務。JavaSpace服務依賴於Jini查詢服務,在需要事務時,必須啟動Jini事務服務,JavaSpace服務還依賴於一個Web伺服器和RMI活動守護程式rmid。
3、JavaSpace服務的屬性
JavaSpace技術簡化了分散式系統的設計與開發。一個JavaSpace服務有五個主要的屬性: 1)JavaSpace服務是一種Jini服務。 2)一個條目將一直保存在JavaSpace服務中,除非它的契約到期,或是由某個程式從JavaSpace服務中取出。 3)JavaSpace服務定位對象的方法是將對象與模板進行比較。模板指定了JavaSpace服務比較各個條目的搜尋條件。如果有一個或多個條目匹配模板,JavaSpace服務將返回其中的一個。 4)JavaSpace服務使用Jini事務管理器來支持操作執行的原子性。 5)JavaSpace服務的對象是共享的。程式可以從JavaSpace服務中讀出或取得條目,改變這些條目的public欄位,以及寫回到JavaSpace服務供其他程式使用。4、永久對象倉庫
JavaSpaces的一個特點是對象數據倉庫。寫入一個空間的項都是正式的Java對象。 但請注意,JavaSpaces並不是一個對象資料庫。Entry實例在位於JavaSpace中時並不是活動的,只是能夠作為拷貝訪問。這表示不能直接更改空間中的一個項。例如,如果在一個空間的某行中兩次寫相同的Entry實例,則此空間中將會有兩個項。因此,空間中不存在維護項的對象標識的概念。5、共享分散式計算
租用、事件和事務處理的產生是由分散式程式設計的特性所決定的。相對於一般的本地計算來說,分散式計算環境中的基礎環境易出錯。JavaSpaces引入了一種不同的模型。JavaSpace:提供了進行通信的一種中介模型。圖1示出這種模型。初看上去,這似乎在分散式系統中又引入了一個可能出問題的環節。但實際功能是分離了進程。不用操心特定進程通信的細節,進程1(上圖1中)所要操心的是寫一個項到JavaSpace,進程2無需關心項是怎樣進入Javaspace的,它只要取走它們,然後做自己的工作即可;對進程進行分離有幾個好處,如果進程2失敗,並不會影響進程1,進程1仍然能夠繼續完成自己的任務;如果需要添加另一個進程到圖中(在圖1所示的緊密耦合模型中),必須更改一個或多個程式的代碼,或者必須一開始就編寫涉及多個進程的複雜代碼,而在圖2中要添加另一個進程只需在圖中簡單地加上它即可。
在上圖中,進程3可以很輕鬆地向空間寫入項了。因為進程1不需要知道進程2的細節,所以添加進程3也不需要更改它,這裡進程2並不關心空間中的項來自何處,它只需使用它們即可,這種鬆散的耦合模型對於降低分散式程式設計的複雜性特別有用。
三、JavaSpaces 技術
分散式環境中的很多應用程式和在本地環境下類似,需要持久地存儲數據,JavaSpaces服務以完整的Jini服務的形式提供這一功能;和其他Jini服務一樣,使用者可以通過查找過程使用其代理找到它,JavaSpaces採用了以Java為中心的策略,它不是數據存儲服務,而是對象存儲服務,也就是說,它保存完全的、有效的Java對象;事實上,它也只能保存Java對象,JavaSpaces徹底理解Java類型系統,可利用類型語義使需要存儲、尋找和取出Java對象的套用更加自然貼切。1、JavaSpaces的起源
創建JavaSpaces的很多工作是基於David Gelernter的早期研究,Gelernter是耶魯大學的計算機科學家,他曾設計了一個稱為Linda的系統,這個系統在很多方面都是JavaSpaces的前身。Linda中的中心概念是元組(tuple)和元組空間,元組是把數據組合在一起的集合,而元組空間是供套用存進和取出元組的“共享黑板區”。這兩個概念很顯然與JavaSpaces中的項目(entry)和空間(space)概念相仿,不過儘管JavaSpaces很大程度上繼承了Linda,但二者還是有些重要的區別。第一,Linda元組不具有Java語言提供的強類型,也就是說,儘管元組中單個的元素(element)可被賦以類型,但整個元組不行。JavaSpaces提供的強類型不僅可用於Entry對象,而且可用於Entry指向的對象。
強類型對於JavaSpaces來說很重要,它使JavaSpaces可很好地滿足那些希望使用Java平台強類型的套用。更進一步,JavaSpaces的Entry對象不僅可以使用強類型,而且它們可以進一步利用Java的類型系統,這意味著客戶可基於超類關係進行搜尋,而Linda只允許值匹配。
第二,Entry對象在JavaSpaces中是真正的對象,也就是說,它們不僅可以有相關的數據,而且可以有方法。由於完整的對象可存儲在JavaSpaces中,因此客戶不僅可以取出“無生命”的數據,而且可以取出所需代碼來操作這些數據。
最後,JavaSpaces很好地遵循了Jini規範和范型。Linda系統一般是用一個很大的、單獨的Linda元組空間,而Jini群體通常可以有多個活躍的JavaSpaces服務,每個服務都可以支持自己單獨的對象存儲區。JavaSpaces的Entry對象是由存儲它們的客戶租借的,因此Jini的自修復能力也很好地套用到這裡。
Java的興趣引起人們對Linda沿續下來的系統產生了新的興趣,其中之一是IBM研究中心的TSpaces系統。TSpaces在很多方面都與JavaSpaces相似,但要大得多。Tspaces支持通過下載的程式修改元組空間的行為,支持資料庫風格的索引和查詢,還允許用戶對元組設定訪問控制安全策略。
2、對象的檔案系統
JavaSpaces的目標是提供"對象的檔案系統",也就是說,JavaSpaces可提供一種無所不在的、自然的方式來存儲和使用對象,它的設計是為了自然地工作於用Java開發的面向對象應用程式。另外和檔案系統相似的是,JavaSpaces可支持在套用之間共享對象,因此就像一個套用(或用戶)可以把檔案放到檔案系統中眾所周知的位置以供其他套用(或用戶)取出一樣,JavaSpaces可作為支持Java的客戶和服務之間共享的通信中介。但通常的檔案系統只存儲"位元組包",如在UNIX和Windows系統中,已分享檔案甚至不與類型相關聯。多數情況下,這取決於使用檔案的套用及已建立的約定,把某種意義或解釋與檔案系統中被稱為檔案的"位元組包"聯繫起來。 而JavaSpaces是面向對象的存儲系統。JavaSpaces不是存儲簡單的無類型數據,它利用Java存儲整個對象,以及作為Java對象所具有的好處:強類型、可移動代碼、安全執行等。因此在JavaSpaces中,被存儲的實體有實際類型,並且可以包含代碼。 JavaSpaces的另一點不同在於尋找被存儲實體的方式。在檔案系統中,對先前存儲數據的訪問是通過命名,檔案系統中的每個檔案都有一個在檔案系統中唯一的名稱。若這個名稱是被使用它的各方周知且認可的(比如C:\autoexec.bat或/dev/tty),則按照約定,它可以有特殊的屬性並且可以被很多其他實體使用。檔案系統中的搜尋通常是搜尋檔案名中的一部分或搜尋檔案的實際內容(適於部分情況如文本檔案)。 在JavaSpaces中,名稱並不重要。事實上,對象的"名稱"只是可用來尋找對象的眾多屬性中的一個。我們可以基於對象的類、超類,或它們實現的接口來搜尋對象,也可以基於對象的屬性搜尋對象-按照約定,任何屬性都和名稱一樣對待。
3、基於屬性的搜尋
如果對象不必用名字來標識它們,那么客戶如何使用JavaSpaces來存儲和找到對象呢?JavaSpaces使用與Jini查找服務基於屬性的搜尋完全相同的技術,每個存儲在JavaSpaces中的對象都必須實現net.Jini.core.entry.Entry接口,意思是它可以被解釋為是其內部成員對象的強類型集合。事實上,JavaSpaces和Jini查找服務使用屬性搜尋的唯一區別,就在於查找服務定義了一組模板如何與一組項目匹配的條件,而JavaSpaces只有匹配單個項目的工具。我們知道Entry是一個無方法的"標記"接口,對象可實現它,告訴系統這個對象的創建者知道此對象被用到查找服務的特殊方式(對象的成員被獨立地序列化等)。Entry對象在JavaSpaces中也具有完全相同的語義:它們被當作是自己指向的公有、非靜態、非最終、非變化對象的集合。每個Entry可通過與其成員對象匹配的"模板"被搜尋,搜尋時使用的模板可以基於類型或對象的值,支持"通配符"。由於相同的概念已被廣泛地套用在Jini查找服務中,因此我們已經熟悉了它。儘管JavaSpaces使用不同的API集來存儲、搜尋和取出對象,但它使用完全相同的基於屬性的搜尋規則。它使用的API更適用於存儲服務的需要。
4、JavaSpaces編程模型
JavaSpaces信奉的哲學是"少就是多";使用JavaSpaces的編程模型很小,在JavaSpaces上可進行的操作只有四種:向JavaSpaces寫入一個新對象; 讀JavaSpaces中的一個對象; 取出JavaSpaces中的一個對象(相當於讀並刪除被讀的項目); 要求JavaSpaces在有與給定模板相匹配的對象被寫入時通知請求者。 就這么多,實在不能再簡化了。這種概念性的操作可通過net.Jini.space.JavaSpace接口中一組稍多些的方法被使用,這些方法為某些操作提供了重載的實現,以在某些方面加速空間的處理。所有這些操作都支持普通Jini中的租借概念,被存儲的對象實際是租借的,客戶必須為存儲的對象續訂租約,否則JavaSpaces將刪除此對象。同樣,JavaSpaces服務也租借事件註冊,就像查找服務一樣。所有這些操作都具有Entry參數,它們用來指定被存儲的對象(寫操作中),或指定被匹配的模板(在讀、取出和通知操作中)。 下面來看一下JavaSpaces的接口,此接口net.Jini.space.JavaSpace由JavaSpaces服務的服務代理實現。和所有Jini代理一樣,我們不知道(通常不必關心)服務代理如何實現此接口,特定的代理可能使用RMI或CORBA或原始套接字來與後端JavaSpaces通信,而服務可以由記憶體中的hash表或完整的資料庫實現。不過有一點是統一的,它們的代理必須實現這個簡單的接口,以使客戶和其他Jini服務能以相同的方式使用它們。 JavaSpace實際的接口定義很簡短緊湊,請參閱程式清單1:
程式清單1 Javaspace.java import net.jini.core.entry.*; import net.jini.entry.*; import net.jini.core.transaction.*; import net.jini.core.event.*; import net.jini.core.1ease.*; import iava.rmi.*; public interface JavaSpace{ Lease write(Entry entry,Transaction txn,long lease) throws TransactionException,RemoteException; long NO_WAIT=0; Entry read(Entry tmpl,Transaction txn,long timeou:) throws UnusableEntryException,TransactionException, InterruptedException,RemoteException; Entry readlfExists(Entry tmpl,Transaction txn, long timeout) throws UnusableEntryException,TransactionException, InterruptedException,RemoteException; Entry take(Entry tmpl,Transaction txn,long timeout) throws UnusableEntryException,TransactionException, InterruptedException,RemoteException; Entry takelfExists(Entry tmpl,Transactzon txn, long timeout) throws UnusableEntryException,TransactionException, interruptedException,RemoteException; EventRegistration notify (Entry tmpl,Transaction txn, RemoteEventListener listener, long lease, MarshalledObject handback) throws TransactionException,RemoteException; Entry snapshot(Entry e)throws RemoteException; ) |
1)Entry 在學習實際的方法前,應該對Entry(項)類給予某種特殊的關注。下面是net.jini.core.entry.Entry的接口定義:
package net.jini.core.entry; public interface Entry extends java點io.Serializable{ } |
2)Read read方法用於在JavaSpace中查找項。從本質上來說,它提供了一種搜尋JavaSpace的方法。
Entry read(Entry tmpl,Transaction txn,long timeout) throws UnusableEntryException,TransactionException, InterruptedException,RemoteException; |
Lease write(Entry entry,Transaction txn,long lease) throws TransactionException,RemoteException; |
7)notify notfiy方法提供感興趣的項被寫入某個空間時到得通知的異步機制。
EventRegistration notify (Entry tmpl,Transaction txn, RemoteEventListener listener,long lease,MarshalledObject handback) throws TransactionException,RemoteException; |
8)snapshot 它是一種最佳化空間性能的方法。
Entry snapshot(Entry e)throws RemoteExceptlon; |
有一件需要注意的重要事情是,這僅對在其上調用snapshot方法的空間有效。如果在另一個不同的空間上調用某個方法並傳遞快照項,則新空間將不承認快照項代表原模板項。另一個要點是取回的項與傳入的項根本不同。不應該將新項與已經擁有的任何項進行比較。
四、JavaSpaces技術的套用
1、簡介
Jini提供了在分散式環境中尋找( look-up)、註冊( registration)、租借(leasing)等功能。而 JavaSpaces則負責管理分散式物件的處理程式( processing)、分享(sharing)、以及流通(migration )等。因此 Jini 與 JavaSpaces 彼此存在著相互合作的關係。簡單的說,JavaSpaces就好像網路上的一個市場,它提供一個簡單、快速、統一的介面,讓網路上分散的資源可以被分享、協調與流通 。對於要存儲對象或使對象可被其他對象使用的很多套用,JavaSpaces技術具有立竿見影的效用。不過也可以通過其他方式使用JavaSpaces,它可以作為一種新的分散式系統編程范型的基礎。這是Linda的最初目的,而Linda正是JavaSpaces的基礎。儘管Linda可以用做簡單的存儲引擎,但它的真正目的是提供一種新的用於創建分散式套用的模型。在這種新模型中,分散式系統的創建將使對象在套用之間"流動",通過中心的Linda元組空間進行協同。這種思想不是為新的分散式套用創建定製的遠程通信接口或協定,而是套用可根據它們寫入元組空間及從元組空間中讀出的對象集合來定義。如果用Java術語描述它,就是說不是為每個新任務定義或細化新的RMI遠程接口,而是JavaSpaces接口將成為套用之間互動的公共API,套用將定義自己的Entry對象集,並給這些對象賦以自己的語義。 Javaspace是一個Jini服務,它提供一種共享分散式對象倉庫。JavaSpaces是用 Java所發展的技術,並且以RMI實作其網路通訊的功能,一般套用在n-tiers 架構的中間層(middle tiers)。JavaSpaces雖然能提供求者與供應者之間查詢與溝通的機制,但它並不是資料庫,而是以簡單的messaging system為基礎,進而提供更強大的功能。除了在Jini套用之外,JavaSpaces技術也可被套用在其它系統與服務中,如:Workflow systems 、Customer management systems、Supply chain management 、Intelligent rich data distribution、 Trading services 、Auction systems 、Resource allocation and management systems、Agent Systems、以及 Publish and subscribe services等,現在我們來簡要地介紹一下幾個可以使用Javaspaces的領域: