我正在開發一個由幾個bundle組成的OSGi應用程序。所有這些都取決於EventAdmin之一。但是,一旦開始捆綁(即在激活器的啓動方法中),一個特定的插件就必須啓動預定的任務。問題是事件管理服務沒有被註冊,我應該等待這個部署。我不想通過配置屬性文件來做到這一點,因此,是否有任何操作可以在不使用Felix的屬性文件的情況下執行此操作?如何等待另一個包?
感謝很多提前
我正在開發一個由幾個bundle組成的OSGi應用程序。所有這些都取決於EventAdmin之一。但是,一旦開始捆綁(即在激活器的啓動方法中),一個特定的插件就必須啓動預定的任務。問題是事件管理服務沒有被註冊,我應該等待這個部署。我不想通過配置屬性文件來做到這一點,因此,是否有任何操作可以在不使用Felix的屬性文件的情況下執行此操作?如何等待另一個包?
感謝很多提前
我已經使用iPOJO這一點。它被設計用於felix &卡拉夫。該庫理解組件的生命週期和依賴關係,當組件依賴關係可用或者一個或多個消失時,將通過@Validate和@Invalidate方法通知您。
當服務(接口)的實現出現或消失時,它還支持@Bind和@Unbind。這使得訂閱更簡單。
您有一個服務和此組件的偵聽器@提供要調用的接口。中央事件寄存器將在這個組件出現時在@Bind方法中出現,而當它出於任何原因時則在@Unbind中被調用。
我懷疑iPOJO應該做所有你需要的依賴管理和綁定。
在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啓動方法中創建一個服務跟蹤器,並跟蹤事件管理服務。一旦你得到一個,你創建一個線程來運行你的代碼。當服務消失時,您中斷線程。但是,這是一個更爲複雜的解決方案。
還有其他的服務依賴管理器,但我強烈建議聲明服務與他們的註釋。