簡體   English   中英

設置了引用的DS OSGi服務后如何直接使用它們?

[英]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函數中調用任何函數,但是如果是這樣,我將如何實現僅在設置了新引用的情況下才能調用的方法?

在極少數情況下應使用動態和可選引用。 盡管我實現了很多組件,但到目前為止,我還沒有使用過動態引用或可選引用。 在數據庫連接的情況下,還有其他問題:

  • 如果在運行兩個SQL語句之間替換了IDatabaseConnect引用怎么辦?
  • 如果調用者訪問了單獨的函數,該IDatabaseConnect被替換,但全局事務是相同的,該怎么辦?

我建議您應該使用非動態,非可選的引用,並將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM