2011-02-23 81 views
1

我想實現以下場景:帶負載平衡擴展的OSGi擴展模式

擴展程序使用擴展程序,擴展程序按其類型分組。例如:Extender =供應商和擴展= HotDogSeller1,HotDogSeller2,PopcornSeller。我的觀點是客戶(客戶)想要購買HotDogs或爆米花,但是他會選擇較少加載的HotDogSeller(較小的隊列)。

我是OSGi的新手,所以我想問問什麼是最佳實踐來實現這個?我想我可以使用Apache Felix和iPojo(它的編號爲extender pattern)。這有兩個問題:

  • 相同的包必須安裝兩次(熱狗的實現,每個都有自己的隊列長度)
  • 以某種方式對相同類型的包(熱狗,爆米花)​​進行分組。這可以通過創建屬性捆綁與一些關鍵像'號碼'以區分HotDogSeller1和HotDogSeller2)
  • +0

    我認爲可以通過更改bundle的URI並將其安裝在不同的符號名稱下來實現。這是有點哈克,但我現在沒有得到不同的想法。 – 2011-02-23 02:13:07

    回答

    1

    我認爲你試圖誤用擴展模式。其中一個關鍵特徵是擴展模式的性質是靜態的:所有事情都是在安裝bundle時發生的。看起來這不是你的情況:爲相同的實現設置多個隊列會讓我認爲這些隊列背後有服務。服務的數量可以動態變化,所以擴展器無法爲您提供良好的服務。

    我認爲如果您使用Whiteboard pattern會更好。 (忽略它針對聽衆機制的事實)。這個想法是,每個捆綁提供服務,它可以處理您的請求。您使用ServiceTacker來跟蹤所有可用的服務。當您需要處理請求時,您將遍歷所有可用的服務,並詢問它們是否可用(您可以選擇在內部處理此內容,而不要與服務實現協商)。當發現免費服務時,您轉發請求。

    您可以通過註冊一個屬性「類型」和相應的值來對它們進行分組,因此您可以使用具有'type''HotDog'和'type''Popcorn'的服務的服務。

    如果你這樣做,你可以使用OSGi聲明式服務,所以你不需要編寫代碼,它可以進行服務註冊或任何其他服務管理。