2011-08-04 19 views
0

我有一個接口定義了系統中的設備。這些設備一次只能用於一個實體。我想將每個設備註冊爲OSGi服務,以便其他人可以通過該機制(使用聲明式服務或服務跟蹤器)訪問設備。但是,據我所知,這種機制允許所有實體請求相同的服務。OSGi有沒有辦法確保一次只有一件事物可以訪問服務?

有沒有辦法讓第一個請求者獲得服務或使用Declarative Services只有一個服務組件滿意?

回答

3

使用ServiceFactory實現設備服務。然後,您可以將唯一的服務對象返回給每個包,然後使用該對象來序列化訪問。或者,如果有任何其他包當前有權訪問該服務,那麼您的ServiceFactory可以將null返回給其他包。

使用ServiceFactory可讓您的服務實現知道捆綁服務正在使用該服務並對其使用進行一些控制。

1

AFAIK您無法使用DS來強制執行單一消費者政策。

乍一看ServiceFactory可能工作,如果它確實是最簡單的方法。

但是有一個caveat"The Framework caches the value returned (unless it is null), and will return the same service object on any future call to BundleContext.getService for the same bundle. This means the Framework must not allow this method to be concurrently called for the same bundle"

所以我認爲這將在以下情況下會失敗:

Given Bundle A, Service S and Bundle B; 
A gets S, then A ungets S, Bgets S, then A gets S. 

框架的緩存可能干擾並給予緩存的S甚至認爲它已經是由B持有。

我能想到的唯一選擇是使用FindHook,雖然這有點低級,你可能想要實現另一個hooks(EventHook,ListenerHook)的完整性。

使用鉤子,你將能夠掩蓋其他包的服務可用性。雖然您的掛鉤將保持狀態,但您會希望它與設備服務在同一捆綁包中,以便在不停止設備服務捆綁的情況下無法停止掛接。

+0

標準還規定:「由ServiceFactory返回的服務對象由框架緩存,直到捆綁包釋放其對服務的使用」,所以我不認爲這會是一個問題。 –

+0

如果一個bundle需要每次同時使用新實例使用該服務會怎麼樣? 我們如何處理? – Ravish

+1

嗨@Ravz,我看到你的問題,尼爾的回答,我有一個ComponentFactory的例子在回答這個問題http://stackoverflow.com/questions/7033222/osgi-using-servicefactories/7080234#7080234 HTH – earcam

相關問題