![](/img/trans.png)
[英]In OSGi DS, how do I get notified when referenced service's properties update?
[英]How to use referenced DS OSGi services directly after they were set?
我幾周前從OSGi開始,對DS有疑問。
可以說我有兩個捆綁軟件,捆綁軟件A和捆綁軟件B。兩者都通過DS / BND注釋注冊了服務。
捆綁軟件A引用了捆綁軟件B的服務,並實現了所需的設置和未設置功能。
@Reference(dynamic = true, optional = true)
void setConnector(IDataBaseConnect connector) {
this.connector = connector;
doSomeStuff();
sysout("Connector SET"); <---- NOT called when doSomeStuff runs into an error
}
當doSomeStuff()遇到錯誤時,將永遠不會調用此方法
void unsetConnector(IDataBaseConnect connector){
this.connector = null
}
如您所見,我希望具有動態的引用和可選的引用,但是,如果連接器服務可用,我想在捆綁軟件A中做一些事情。
在我的情況下,捆綁軟件B具有一些基本的數據庫功能。 捆綁軟件A使用它從數據庫中讀取一些數據並將其緩存在某些Java對象中。 該數據將由其他服務使用。
但是,我對此方法有疑問。 如果我的數據庫服務引用設置為Bundle A,我將在setConnector函數中啟動數據庫操作。 只要一切順利,我就沒有問題。 設置參考,數據變為紅色,一切正常。 但是,如果DB-Service遇到異常(是,它已被捕獲並處理),則DS似乎“忘記”了設置的Reference,並且當我停止該服務時,它將永遠不會被刪除。
我想我不應該在setConnector函數中調用任何函數,但是如果是這樣,我將如何實現僅在設置了新引用的情況下才能調用的方法?
在極少數情況下應使用動態和可選引用。 盡管我實現了很多組件,但到目前為止,我還沒有使用過動態引用或可選引用。 在數據庫連接的情況下,還有其他問題:
我建議您應該使用非動態,非可選的引用,並將doSomeStuff()邏輯放入您的Activate方法中。 在這種情況下,您可以確保在您的業務邏輯運行時該引用可用。
如果doSomeStuff()
拋出一個異常,然后該異常從綁定方法setConnector
傳播出去,則DS將假定您的綁定方法已損壞,並且您的組件無法接受綁定的服務。 然后,DS將認為該服務未綁定到組件,因此將不會調用該服務的unbind方法。
您需要在bind方法中處理來自doSomeStuff()
任何異常。 例如:
@Reference(dynamic = true, optional = true)
void setConnector(IDataBaseConnect connector) {
this.connector = connector;
try {
doSomeStuff();
} catch (Exception e) {
// handle e but don't let it propagate out of this bind method
}
sysout("Connector SET");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.