Jini技術面向網絡及分布式計算的特性決定了Jini技術必然與傳統的單機系統在許多方面有概念上和實際應用中的差別。如網絡的延遲、失敗,或者設備的突然撤出,將導致信息的無序和丟失;資源的獲得、保存、維護和回收情況更為復雜;不同實體之間通訊和協調工作的可靠性及效率並不像單機系統中那樣較為容易地獲得保證。因而在 Jini 中以 Java 為基礎加入了分布式編程模式,特別是引入了租約、分布式事務和分布式事件。
租約
租約的基本概念是資源只能被使用一段時間,這由租約的持有者(lease holder)和租約的授權者(lease grantor)協商決定。
租約接口的目標是為分布式系統和應用程序提供一種特別的編程風格。這種編程風格是當某對象首次對該資源訪問時,由這兩個對象先協商,最後授權對資源進行某段時間的使用。
在非分布式系統中,資源或服務將被授權直到被明確釋放或放棄,這種編程模式在分布式系統中注定要失敗,原因是不能保證放棄對資源或系統的使用是肯定成功的,這將導致系統的這部分資源永遠不會被釋放。
為避免此類問題而引入了租約的概念。在租約中被租用的資源或服務的授權是基於時間的。一旦租借時間期滿,服務就將結束,資源將被釋放。租約的期限在第一次授權時決定,由租約的授權者和接收者采用request/response方式協商。租約可以在期滿前續約或取消。期滿時,雙方認為服務或資源已回收。
租約概念的引入也可以用於解決分布式系統面臨的另一個問題。連續開機的分布式系統趨向於積累過時和不必要的信息,解決這種問題的常規方法是把清理無用資源作為一項系統管理員的任務。然而,當這種資源被租用時,就不會發生過時信息的積累,也不再需要以手工方法清除。租用的信息或資源僅在租約續約時才保存在系統中。因此被遺忘的信息經過有限時間後將被刪除。
Jini系統中定義了一組接口以及相關的約定和協議,目的是使不同Java虛擬機通過協商產生各種資源的使用租約。可形成租約的協議有多種,可以分為對某個對象的訪問(引用)協議、對未來采取行動(事件通知)的協議和提供長久儲存的協議等。租約機制要和並發機制相結合,即某資源可以有多個並發的租約持有者。
租約的特性包括:授權者確保持有者能在一段時間內對資源進行訪問;在租約期限內,租約持有者可以取消租約,授權者將清除相關的資源;持有者可以要求續約,續約期限由雙方協商決定;若租約到期,授權者將釋放相關資源,與取消租約的不同之處在於,授權者與持有者之間不需要通訊。
事務
事務式的行為在分布式計算中尤其重要,它提供了使一個或多個遠程參加者對一系列操作的結果保持一致的方法。Jini系統將實現事務語義交由事務中的個體對象處理。系統首先要提供的是對象之間確認事務時用來交換信息的合作機制,目標是提供最小的協議和接口的集合,用以讓對象實現事務語義。
Jini描述的完成協議由分布式系統的兩階段提交協議組成。兩階段提交協議定義了分布式對象資源的通訊模式,這個協議需要一個管理者來保證操作集決議的一致性,即保證所有的參加者最終知道它們是應提交操作還是放棄操作。
事務由一個管理者創建和監督,每個事務由一個標識來代表,它對於事務的管理者是唯一的。客戶通過一個對管理者的請求來創建事務,通常使用語義工廠類,如Transactionfactory來創建一個語義對象。在對一個服務實行操作時,這個語義對象就將作為一個參數傳遞。如果服務同意接受這個事務並管理它的操作,它必須作為一個參加者加入到這個事務中去。
如果一個事務成功提交,那麼所有在事務之下進行的操作都將完成。放棄事務意味著所有在事務之下進行的操作都如同完全沒有發生過一樣。提交事務需要每個參加者“表決”,表決可選擇“就緒”(准備提交)、“未改變”(只讀),或者“放棄”(事務應被放棄)。
兩階段提交協議的設計目標是使對象能夠提供ACID屬性。缺省的事務語義定義了保留這些屬性的一個方法。ACID屬性是:
·Atomicity(原子化):所有在一個事務下的操作全部發生或者一個也不發生。
·Consistency(一致性):事務的完成必須使系統保持在一致的狀態。事務只是一個使保證一致性成為可能的工具,而它本身並不是一致性的保證者。
·Isolation(隔離性):正在執行的事務不應彼此影響。一個事務的參加者應該只能看到自己事務中操作的中間狀態,而不是其它事務的中間狀態。
·Durability(耐用性):事務提交的結果應像事務提交的對象實體一樣持久,但這個保證只能由對象來完成。
依賴於參加者來實現ACID屬性是兩階段提交協議與傳統事務處理系統的最大不同之處。兩階段提交協議的定義使用了三個主要類型:
·Transactionmanager——事務管理者創建新的事務並協調參加者的動作。
·NestableTransactionManager——一些事務管理者能夠支持嵌套的事務。
·TransactionParticipant——當操作是在一個事務之下進行的,參加者必須加入事務,給管理者提供一個對 TransactonParticipant對象的引用,以便用來表決。
分布式事件
1.分布式事件及通知
分布式事件系統有一些與單機系統不同的特點和需要。由於存在網絡延遲和失敗的可能性,遠程對象事件的通知的順序可能因客戶的不同而異,或者根本沒有到達。一個通知到達的時間可能會很長,也可能會有這種情況,接收通知的對象一方不總是希望立即得到通知,而是在接收一方決定的一個確定時間得到。甚至可能發生注冊興趣的對象並不是事件通知應發送的對象。
分布式通知的中心概念是在產生通知的對象和希望接收通知的其他對象之間加入第三方對象。它們可以從對象上卸下通知,實現多種傳遞保證,存儲通知,並進行通知的過濾和重新路由。
2.基本接口和類
Jini 技術中分布式事件的接口定義了一個協議。通過使用該協議,一個Java 虛擬機的對象可以在其他Java 虛擬機對象上注冊感興趣的事件,並在事件發生時得到通知。接口中還規定了這類通知中必須包含的信息。協議中並未體現通知的可靠性與時限,這種保證並非協議的一部分,而是涉及到不同對象的一部分。
2.1涉及到的實體
事件和通知接口定義了實體的基本類型、對提交給實體的信息的需求,及一些支持性接口和類。
分布式系統中基本的對象有:對事件注冊感興趣的對象、發生事件的對象(事件產生者)和事件通知的接收者(遠程事件監聽者)。
事件產生者有某些其他對象可能會感興趣的抽象狀態,並允許其他對象對此事件注冊興趣。事件發生時,它將產生通知,發送通知到注冊過此類事件的事件監聽者。
基本類型由RemoteEventListener定義。遠程事件監聽者對其他對象發生的某類事件感興趣。一個遠程事件監聽者的主要功能是接受其他對象中事件發生的通知。
支持性接口和類包括RemoteEvent對象、用作注冊標識的EventRegistration對象,及一組可能產生的例外。遠程事件是從事件產生者傳遞到遠程事件監聽者的對象,用來指示某類特殊事件的發生。EventRegistration類定義了返回注冊者需要信息的對象,它是遠程事件注冊調用的返回值。EventRegistration類的實例包括一個事件類型的標識、當前事件類型的序列號,及一個注冊的Lease對象。
保持與遠程事件注冊模型一致性的接口應反映:
·事件的注冊是限定時間的,其方法是使那些注冊在需要的時候續約。這可反映為返回一個注冊的租約,把它作為事件注冊的一部分。
·通知無需傳送至最初注冊興趣的實體,即使用第三方過濾器。
·通知可以包含由原始注冊者提供的MarshalledObject,使事件通知中能包含任意信息;注冊調用應包括MarshalledObjecct以作為RemoteEvent的一部分來傳送。
2.2 RemoteEventListener接口
RemoteEventListener是RemoteEvents的接收者。RemoteEventListener由一個只包含一個notify方法的接口來定義。方法將返回注冊時導入的信息,允許登記者將任意信息或動作與通知信息關聯起來。
RemoteEventListener接口應由希望從其他對象收到 RemoteEvent通知的對象所實現。為使事件發生的通知送至其他對象,注冊調用需要接收一個目標參數來指明通知所應送達的對象。
RemoteEventListener接口繼承自Remote接口及java.util.EventListener接口。前者說明RemoteEventListener中的方法為遠程方法,支持這些方法的對象將通過RMI傳遞引用。後者用於Java AWT及JavaBeans組件中來指明某個接口是事件通知的接收者。RemoteEventListener接口由一個notify方法組成。
2.3 RemoteEvent類
RemoteEvent對象所包含的的基本形式包括:對發生事件的對象的引用、標識事件類型的長整型、一個指明發生的此類事件的序列號的long,和一個回復的Marshalled Object,它是注冊者注冊的一部分。這些RemoteEvent的通知對象作為RemoteEventListener對象notify方法的參數傳遞給 RemoteEventListener。
事件標識及從 RemoteEvent 對象得到的事件發生者引用的組合應唯一確定事件類型。如果此類型並非RemoteEventListener中注冊興趣(或其他代表RemoteEventListener注冊)的類型,遠程事件監聽器的notify方法將拋出 UnknownEventException的例外。
從RemoteEvent對象獲得的序列號是一個遞增的值,以此來判定遠程事件發生的先後順序。
2.4 EventRegistration類
EventRegistration類的對象用於封裝客戶所需要的信息,標識出作為注冊請求應答的通知,並維護此注冊請求。一個允許事件注冊的方法並不一定要返回一個EventRegistration類型的對象,但這個類的確包含了在事件模型中需要返回的信息類型。