Chapter 3 Design and Realization
3.3 Implementation
3.3.3 Peer-to-Peer Layer
3.3.3.3 Peer-to-Peer Location Service
P2P Location Service 介面的主要功能就是提供更新 User Binding 與查詢 User Binding 的 函數原型。本論文利用 JXTA 的 Discovery Service 實作了 P2P Location Service,稱為 JXTA Location Service,後面就是描述實作的細節。
JXTA Location Service 在建構時,要傳入 Pipe Advertisement 與 JXTA SIP Peer Group 為參 數。所有透過這個 Location Service 產生的 User Binding 都會包含這個 Pipe
Advertisement,當其他的 JXTA SIP Peer 取得該 User Binding 後,就能藉由其中的 Pipe Advertisement 與對應的 P2P Transport 建立連線。JXTA Location Service 會利用 JXTA SIP Peer Group 拿到 Discovery Service 與 Peer Group ID。Peer Group ID 被用來產生 User Binding Advertisement 的 ID,而 Discovery Service 則是來發佈與搜尋 User Binding Advertisement。
JXTA User Binding 必須要轉成 Advertisement 的型態,才可以透過 Discovery Service 將 這個資源發佈到 JXTA 同儕網路上或者從中搜尋。因此我們設計了 User Binding
Advertisement,它裡面包含了一個 JXTA User Binding 並繼承了 JXTA 的 Advertisement,
19
讓 URI 變成可以被搜尋比對的屬性。
圖 16:User Binding Advertisement 類別圖
JXTA Location Service 更新本地端 UA 的 contact address 的步驟如圖 17:
1. JXTA Location Service 會先檢視是否已有這個 UA 的 User Binding 資料,若沒有則 建立一個 JXTA User Binding。
2. 把 Contact header 加到 User Binding 裡,若已有相同的 contact address 存在,就會覆 蓋,則 expires 等其他資訊就會更新。
3. 建立 User Binding Advertisement,利用 JXTA SIP Peer Group 的 Peer Group ID 演算 出來的 ID 設為此 Advertisement 的 ID。
4. 將更新過的 User Binding 加到 User Binding Advertisement 中。
5. 透過 Discovery Service 把 User Binding Advertisement 發佈出去。
6. 檢視 JXTA User Binding 的 ID,若不為 null,表示有舊的 User Binding Advertisement 存放在本地快取(local cache)裡,利用 Discovery Service 把這個 ID 的 Advertisement 從本地快取中移除。
7. 最後,將 User Binding 裡的 ID,設定成先前發佈出去的 User Binding Advertisement 的 ID,以供下次更新時,可以依據這個 ID 清除過時的 User Binding Advertisement。
20
[ub.getID != null]
flushAdvertisements old_id setID
new_id
圖 17:JXTA Location Service 更新 contact address 的循序圖
透過 JXTA Location Service 查詢 User Binding 時,先檢查欲查詢的 User Binding 是否為 本地端 UA,若是本地端 UA 則直接呼叫 getUserContactURLs,以取得未過期的 Contact Address。如果不是本地端 UA,就要執行 get Remote User Binding 來進行搜尋。在 get Remote User Binding 的設計裡面,會需要呼叫 JXTA Discovery Service 的 get Remote Advertisements,這個方法會透過 Rendezvous Super Peer 搜尋 advertisement。但是 get Remote Advertisements 不會立即回傳結果,而是非同步的方式回傳尋找到的
21
advertisement,為了克服這個問題,我們設計了 Query Listener,它實作了 JXTA 的 Discovery Listener,可以監聽 Discovery Service 回傳的訊息,它還提供了 get User Binding 這個方法,讓別人可以取得 Query Listener 收到的 advertisement 裡的 User Binding。我們 亦在其中設計了 synchronization 的機制,get User Binding 方法會等待 Query Listener 收 到回傳訊息後才會繼續執行下去,把 User Binding 回傳,否則就一直等待下去,直到 timeout。下面針對 get Remote User Binding 的步驟作說明:
1. JXTA Location Service 首先會呼叫 JXTA 的 Discovery Service 檢查想要搜尋的 advertisement 是否已在本地快取裡面。是的話,Discovery Service 會回傳 User Binding Advertisement。JXTA Location Service 再將 advertisement 裡的 User Binding 回傳就 完成了。
2. 若 advertisement 並未在本地快取中,則 JXTA Location Service 會先建立一個 Query Listener,接著呼叫 Discovery Service 的 get Remote Advertisements,並把 Query Listener 當成參數傳入,然後再呼叫 Query Listener 的 get User Binding。
3. 因為有 synchronization 的機制,Query Listener 的 get User Binding 會讓目前的執行 緒停住(wait),在收到任何回傳訊息前這個方法都不會執行下去。
4. 等到 Query Listener 收到了剛才查詢的結果後,會通知(notify)暫停的執行緒,繼續 完成 get User Binding 的動作,取得欲找的 User Binding 並回傳。
22
圖 18:JXTA Location Service 搜尋遠端 User Binding 的循序圖