JavaSpaces

5)JavaSpace服務的對象是共享的。 存儲數據,JavaSpaces服務以完整的Jin JavaSpaces的En

一、概述

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中列出的七個方法可用來提供某些非常複雜的行為的機制。不過,在遇到複雜問題時,最好從簡單的地方入手。幸運的是,這些接口都很簡單。
1)Entry 在學習實際的方法前,應該對Entry(項)類給予某種特殊的關注。下面是net.jini.core.entry.Entry的接口定義:
package net.jini.core.entry;
public interface Entry extends java點io.Serializable{
}
在建造一個實現項的類時,需要遵循以下幾條規則:Entry子類的每個欄位必須是公共的(欄位可以是非公共的,但不能把它們保存在空間中);欄位不能為簡單欄位,它們必須是對象;欄位必須是可串列化的;必須提供一個公共的無參數的構造函式。
2)Read read方法用於在JavaSpace中查找項。從本質上來說,它提供了一種搜尋JavaSpace的方法。
Entry read(Entry tmpl,Transaction txn,long timeout)
throws UnusableEntryException,TransactionException,
InterruptedException,RemoteException;
第一個參數是一個項,用作執行搜尋的模板,如果項的某個欄位為空,則空間中相同類型的任意項內的同一個欄位都將匹配,這裡"類型"一詞用來表示匹配項可以是與模板相同的類或者是模板的子類。如果模板中的一個欄位不為空,則相同類中其他項內的欄位必須精確匹配;如果找到一個匹配,就會返回匹配項;如果空間中有不止一個匹配項,則空間可以返回任意匹配項;至於返回哪個項不能保證,這表示不應該指望讀項的順序會有什麼對應關係(如到達的順序等);第二個參數提供了一個Transaction實例,應該在其下執行讀操作; 最後一個參數為長整型,以毫秒為單位,此值說明在read方法中對於匹配項的出現在空間中要等待多久。這表示,如果一個匹配項在第一次調用read方法時不在空間中,則read方法將等待此項被添加到空間中,等待時間為此參數給出的逾時值,如果等待時間超過逾時值後還沒有項匹配,則返回空。 3)readlfExists readlfExists方法是一個非常類似於read的方法,它具有與read完全相同的參數和返回值;不過,readlfExists在這些參數的使用上稍有不同,它也是用來搜尋空間的,而且使用相同的匹配模板實例的規則,read和readlfExists的不同之處在於逾時值的處理。 readlfExists方法試圖匹配作為第一個參數傳入的模板項,如果未匹配,它立即返回,而不是像read方法那樣等待匹配項。既然它立即返回,那么還要逾時參數乾什麼呢? 這個問題涉及Javaspaces怎樣處理事務,一個匹配項可能位於空間中,但可能在至今尚未完成的事務處理下寫過,這表示此匹配項並不真正對readlfExists方法可見,逾時參數指出readlfExists等待完成此未結束的事務處理要等多久。因此read方法要等待直至找到匹配項或逾時期滿,而readlfExists方法僅在恰好存在與未結束事務處理之下的匹配項相同的匹配項時等待。 4)take take方法也具有與read方法相同的參數和返回值。它使用項模板的相同匹配規則,其逾時值與read的逾時值類似,即等待直到匹配項出現為止。但其重要的差別在於,如果找到一個匹配項,不僅返回給方法的調用者,而且還從空間中刪除它。另外,如果多個客戶機調用take方法且它們匹配空間中相同的項,則只有一個客戶機取得該項,而其他客戶機得到空返回值。 5)takelfExists 就像readlfExists方法對應於read方法一樣,takelfExists方法對應於take方法,即它的逾時參數指出等待具有一個匹配項的未結束的事務處理完成要等待多長時間。 6)write write方法用於把項放入空間。
Lease write(Entry entry,Transaction txn,long lease)
throws TransactionException,RemoteException;
 write以希望放入空間的項作為第一個參數。請注意,任意種類的項都可以寫入一個空間。write方法也使用write所屬的Transaction實例以及一個租用參數,write方法的返回值為一個Lease實例。這允許調用者對將項保留在空間中有某些控制權。
7)notify notfiy方法提供感興趣的項被寫入某個空間時到得通知的異步機制。
EventRegistration notify (Entry tmpl,Transaction txn,
RemoteEventListener listener,long lease,MarshalledObject handback)
throws TransactionException,RemoteException;
第一個Entry參數指出匹配空間中的項時使用的模板,匹配規則與read方法的相同,與read方法不同的是notify指出調用者對只要寫匹配項就得到通知感興趣,而不是對調用時在那裡的項感興趣。RemoteEventListener參數告訴空間送回事件給誰,在寫一個新項到匹配模板的空間時,此空間傳送一個事件到RemoteEventListener,以便它可以處理此事件;Handback參數作為事件數據的組成部分被傳送到監聽程式,這給notify方法的請求者提供了與Listener實例通信的一種途徑;Lease參數指出調用者在接收通知時等待多長時間,時間以毫秒表示;EventRegistration返回的值為notify方法的調用者(如Lease實例)管理其註冊提供某些信息。
8)snapshot 它是一種最佳化空間性能的方法。
Entry snapshot(Entry e)throws RemoteExceptlon;
 在利用相同的模板項對一個空間重複調用方法時,snapshot方法有助於提高程式的性能。Snapshot工作的方式是你對傳遞希望最佳化性能的模板的空間調用它, 調用之後返回一個Entry實例,此Entry實例代表傳入的項。基本上,空間會記住此新項實際上是舊項。在傳遞的這個新代表項調用空間時,避免了串列處理的大量開銷。在模板項很大且串列化代價很高時,這樣做可以極大地改善性能。
有一件需要注意的重要事情是,這僅對在其上調用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的領域:

2、信息共享

Javaspaces可以共享對象。因此,許多Javaspaces的應用程式可以做這個工作是不奇怪的。 可通過空間方便地交換信息。寫到一個空間的每個項都可以從該空間的任一個客戶機讀出。 讀取者和寫入者不需要互相了解。所需知道的只是何種項放入了此空間。例如,空間可在聊天或通話系統中使用,這種系統已經變得非常流行了。其中,空間被用作共享的留言板,多個客戶機可以寫入和讀取訊息。

3、計算服務

除共享數據以外,Javaspaces的一個非常有意思的用途是共享分散式系統計算。 一般在這種用法中,計算一個(或多個)問題塊的產生器可能很昂貴,但這種問題可以分成並行任務。產生器把問題塊傳送到某個JavaSpace。然後,運行在分離的機器上的該空間的客戶機使用這些塊,進行計算並將完成了的塊返回給JavaSpace。然後再把這些完成的塊裝配起來。

4、工作流

JavaSpaces也很適合於管理工作流環境。可以把工作流環境與純計算服務環境區分開來,在工作流環境中所調度的工作可以由人而不是純計算完成。

相關詞條

相關搜尋

熱門詞條

聯絡我們