2011-09-29 38 views
0

如果我正在使用聲明式服務,是否可以手動停用OSGi中的組件?OSGi DS&手動停用組件

例如,假設我有一個組件,以實現:

//component 
class Overseer(){ 
     List<ServiceReference> serviceRefs = ...//populate 

     private void doStuff(){ 
      serviceRef = serviceRefs[i]; 
      if(dontNeedThisAnymore){ 
       serviceRefs.remove(serviceRef); 
       serviceRef.getBundle().stop(); 

      } 
} 

回答

4

最好的方式做,這是在同一個包,另一個組件使用ComponentContext API。

您可以編寫一個組件,以便將ComponentContext作爲其激活方法的參數。該接口有enableComponentdisableComponent方法可用於啓用/禁用同一捆綁中的其他組件。

我稱之爲「網守」組件,因爲它可以用於在啓用它們之前設置其他組件所需的資源。例如,您可能有多個組件需要啓動數據庫才能完成其工作......網守會負責啓動數據庫,然後致電enableComponent(null)以啓用其他組件。同樣,如果網守可以檢測到數據庫已關閉,並在此時禁用其他組件。爲了達到這個目的,捆綁中除關守之外的所有組件需要首先設置爲enabled="false"

+0

那麼這是否意味着放棄這些組件的DS? – drozzy

+0

不,它不。 –