簡體   English   中英

如何檢測bundle是否在osgi容器中完全加載?

[英]how to detect if a bundle is completely loaded in osgi container?

是否有任何類型的事件偵聽器,如BundleEvent類中的事件偵聽器,用於檢測bundle是否已完全加載並可用於請求?

我做了一個搜索,我能找到的就是這個

不使用事件監聽器,意味着我需要手動或定期檢查(我沒有測試那段代碼。

有沒有像BundleEvent.STARTING這樣的事件來進行加載操作? 或者我們需要自己實施(如果可能的話)?

OSGi框架無法知道您的捆綁包何時“准備好”用於業務。 框架當然可以確保解析bundle的代碼依賴性以允許加載類。 但是框架無法知道任何其他依賴項。 只有您的捆綁包可以知道何時可以開展業務。 您可以通過注冊表示此功能的服務來宣傳這一點。

正如BJ所提到的,一種選擇是使用OSGi服務。 例如,捆綁包B將等待服務出現。 當捆綁包A准備好(例如,激活完成)時,它注冊服務。 這將通知捆綁包B.您可以使用ServiceTracker

另一種選擇是使用BundleTracker 在包B的激活,你可以注冊一個BundleTracker是獲取通知STARTED捆綁的狀態。 但是,您還希望監視其他狀態,以便在捆綁包消失時發現。

在OSGi中,有兩種依賴關系。 第一種基本上是設置一個環境,在這種環境中你的bundle可以安全地運行。 這包括您可以在清單中表達的代碼依賴性和其他依賴項。 該框架確保在解析捆綁包之前滿足這些依賴關系。 如果不滿足這些依賴關系,您將無法運行單個指令。

第二種依賴關系更具動態性,您的代碼應該能夠在運行時更改時處理它們。 在OSGi中,這些依賴關系是表達最好的服務。 使用聲明性服務(特別是注釋),依賴其他人是微不足道的(請不要使用服務跟蹤器,DS遠遠超出優勢)。

因此,正如其他響應者所說,准備就在旁觀者的眼中。 在OSGi中,當您表達對服務的依賴關系時,問題從捆綁包中移開已經准備就緒,以便:是否有服務X? 只要服務X的注冊商遵循這些規則,您就擁有一個非常強大且有彈性的應用程序模型。 由於框架和DS嚴格遵循生命周期規則,因此在單個模型中捆綁包准備好或不崩潰的原因有很多種:服務。

簡短的例子,服務Y取決於服務X:

@Component 
public class YImpl implements Y {

   @Activate
   void activate() { /* only called when X is registered */ }
   @Reference
   void setX( X x ) {
      this.x = x;
   }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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