我一直在嘗試一些關於Karaf的OSGi聲明式服務(其中包括諸如Blueprint)的示例。我想現在要解決的問題是如何在運行時獲取對某些服務的引用(這樣的註解和/或XML這裏是不是一個真正的選擇)OSGi聲明式服務在運行時過濾引用
我會解釋我的使用情況:
我試圖設計(迄今爲止只在我的腦海中,這就是爲什麼我仍然只是試驗OSGi :))一個系統來控制工業中的某些自動化過程。爲了與設備通信,正在使用一組特殊的協議。爲了使組件儘可能重用,我設計了一個基於圖層的通信模型(例如用於網絡的ISO/OSI模型,但更簡單)
要將其轉換爲OSGi,我的系統的每一層一套捆綁。一個用於該層的接口,然後是該層的每個實現的一個插件(想象爲OSI的傳輸層上的TCP與UDP)。
要引用此類網絡中的任何設備,將使用自定義地址格式(此類地址的兩個示例可以是xpa://12.5/03FE或xpb://12.5/03FE)。這樣的地址包含了訪問所請求的設備所需的所有關於圖層及其值的信息。你可以猜到,這個地址的每個部分代表了我的網絡模型的一個層。
這些地址將被存儲在某個配置數據庫中(所以再次簡單的.cfg或.properties文件不是一個選項),以便它們可以在運行時遠程更改。
我正在考慮創建一個工廠,它將解析這個地址,並根據它的所有組件,創建一個對象鏈(從OSGi獲得適當的服務),實現所有層並相應地配置它們。由於可以有更多的單層實現(因此,更多的服務實現單個接口),因此這個工廠需要在運行時(當它獲取設備地址作爲字符串傳遞時),決定哪個特定的實現選擇(根據服務將聲明的其他屬性)。
這怎麼可能在OSGi中實現? DS,Blueprint還是其他什麼方法更好?
謝謝Tim!我們遇到了這個問題,在閱讀完所有DS規範後,並沒有變得更聰明。目標過濾器屬性是動態的事實在任何地方(或是否?)都沒有提及或解釋,並且可能被誤認爲是DS運行時的實現細節。 –
OSG R5綱要第112.3.6節(選擇目標服務): –
謝謝,我將接受的答案改爲你的答案 –