2013-07-29 47 views
1

我正在開發一個由幾個bundle組成的OSGi應用程序。所有這些都取決於EventAdmin之一。但是,一旦開始捆綁(即在激活器的啓動方法中),一個特定的插件就必須啓動預定的任務。問題是事件管理服務沒有被註冊,我應該等待這個部署。我不想通過配置屬性文件來做到這一點,因此,是否有任何操作可以在不使用Felix的屬性文件的情況下執行此操作?如何等待另一個包?

感謝很多提前

回答

0

我已經使用iPOJO這一點。它被設計用於felix &卡拉夫。該庫理解組件的生命週期和依賴關係,當組件依賴關係可用或者一個或多個消失時,將通過@Validate和@Invalidate方法通知您。

當服務(接口)的實現出現或消失時,它還支持@Bind和@Unbind。這使得訂閱更簡單。

您有一個服務和此組件的偵聽器@提供要調用的接口。中央事件寄存器將在這個組件出現時在@Bind方法中出現,而當它出於任何原因時則在@Unbind中被調用。

我懷疑iPOJO應該做所有你需要的依賴管理和綁定。

2

在OSGi中沒有開始排序...克服它...雖然有影響初始開始排序的機制,但問題是任何時間束都可以停止。所以唯一的解決方案是實際處理你對事件管理的依賴。

隨着聲明式服務(DS),這實際上是非常少的工作。另外,請忘記捆綁激活器,他們捆綁單身人士,因此是一個壞主意。因此,在DS你會做(使用說明)以下內容:

@Component(immediate=true) 
public class MyTask extends Thread { 
    EventAdmin ea; 


    public void run() { 
     while (!isInterrupted()) { 
      // do something 
      ea.postEvent(...); 
     } 
    } 

    @Activate void activate()      { this.start();} 
    @Deactivate void deactivate()     { this.interrupt(); } 
    @Reference void setEventAdmin(EventAdmin ea) { this.ea = ea;} 
} 

有你不應該使用DS和被卡住捆綁活化劑罕見的情況下,但他們是罕見的,應該越來越少。如果您遇到了這樣一個非常糟糕的情況,那麼您還可以在Bundle Activator啓動方法中創建一個服務跟蹤器,並跟蹤事件管理服務。一旦你得到一個,你創建一個線程來運行你的代碼。當服務消失時,您中斷線程。但是,這是一個更爲複雜的解決方案。

還有其他的服務依賴管理器,但我強烈建議聲明服務與他們的註釋。

相關問題