查找服務的服務模型
查找服務保存了一個服務的表,表中的每個元素代表了系統中可用的一項服務,其中保存了訪問這項服務所需要的代碼和一系列可擴充的描述服務的屬性。打個比方,查找服務就像電話簿,Jini系統中的服務就像電話簿中的用戶,查找服務中保存的信息就是用戶的電話號碼。也就是說,凡是需要訪問Jini系統中的服務,就必須知道查找服務中保存的“電話號碼”。但是查找服務有不少超過電話簿的優點,例如:查找服務保存的是一個動態的“電話簿”,而且,系統中的服務可以在“電話簿”中主動加入和去掉自己的“電話號碼”,而查找服務也完全支持這種機制。而在以后的內容里,我們會發現更多的不同點。
當服務在查找服務中注冊后,會產生一個通知事件。系統管理員可以利用查找服務中的事件回調機制來收到這個通知。這就有利于系統管理員管理和維護系統。而且服務也會提供設置自身的用戶界面,這個用戶界面可以作為服務的屬性保存到查找服務中。管理員能輕松地設置服務,不用忙著到處找各種各樣的驅動程序和管理軟件。
在服務的有效期內,如果服務遇到問題需要引起管理員的注意,例如打印服務發現紙張短缺服務就增加一個屬性來指明問題。更改后的結果會保存到查找服務中。這時,同上所述,管理員利用查找服務的事件回調機制來收到上述問題的通知。有了這個有力的機制,大大減輕了系統管理員的負擔。
發現協議和加入協議
網絡中的服務在啟動后,怎樣加入到分布式Jini系統中,成為Jini系統中的服務,有兩個重要的必不可少的步驟。第一步肯定是找到系統中的查找服務,這個過程就是Discovery過程,用到的協議就是發現協議。第二步就是把自己注冊到查找服務中,這個過程是Join過程,描述這個過程的協議就是Join協議。一項服務在完成了這兩步后,就真正成為了Jini系統中的一位成員。為了準確地描述這兩個協議,先介紹一下用到的術語。
主機。擁有一或多個Java虛擬機并且能加入網絡的一個硬件設備被稱為主機組。一組Jini服務所組成的集合。組的名字是任意的字符串,用來描述該組的性質。
Discovery實體。Discovery實體就是處于同一主機內,將要開始,或者正處在找到查找服務的過程中一個或多個相互協作的Java語言中的對象的集合。
Join實體。Join實體就是處于同一主機內,已經獲得了查找服務,處于從查找服務中查詢服務或者將自己注冊到Jini系統內過程中的一個或多個相互協作的Java語言中的對象的集合。在以后的文章中,為了方便描述,將Discovery實體和Join實體統稱為實體。
Jini系統中的服務包括的范圍很廣,包括各種純軟件的服務和硬件設備的服務。如果一臺主機希望加入Jini系統,成為Jini系統中的一項服務,需要具備以下幾個條件:首先需要一個能夠運行Jini代碼的Java虛擬機;其次需要一個正確配置的網絡協議棧。這個網絡協議棧隨著網絡協議的不同而改變。這里假定采用的網絡層的協議是IP協議,此時以下幾個條件是必不可少的:IP地址(IP地址或者是靜態IP地址,或者是由主機利用DHCP協議來取得的動態IP地址);支持TCP協議和UDP多點傳送協議(在Discovery過程中會用到這兩種協議)。舉個例子,一臺聯網的、安裝了JDK(Java開發工具包)的個人電腦就是一臺主機。
每個查找服務都有相關聯的組,這樣可以使Jini系統中的服務結構更有層次感。例如:一個特定的查找服務可以屬于打印設備組,任何打印服務都可以注冊到該查找服務中。當然,組都是預定義的。在Discovery的過程中,Discovery實體確定自己感興趣的組,也就是自己希望加入的組,如果找到的查找服務也屬于這樣的組,Discovery實體就加入到這個查找服務中。這就避免了查找服務的結構過于龐大,把組織系統中服務的責任分攤給系統中多個不同的查找服務。目前,組的命名還沒有一個明確的規范,Sun公司只是希望組的名字最好符合網絡域名的命名規范,但是目前并沒有給出如何定義組的名字的詳細規范。我們相信在未來的發展過程中,隨著對Jini系統中服務的組織結構層次性要求的提高,這種命名規范會隨之完善起來的。