OSGi에는 시작 순서가 없습니다 ... 처음 시작 순서에 영향을주는 메커니즘이 있지만 문제는 모든 번들이 언제든지 중지 될 수 있다는 것입니다. 따라서 유일한 해결책은 이벤트 관리자에 대한 의존성을 실제로 처리하는 것입니다.
선언적 서비스 (DS)에서는 실제로는 거의 작동하지 않습니다. 또한, 번들 activator 잊어 버려, 그들은 번들 싱글 톤이며 따라서 나쁜 생각입니다. 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 시작 메소드에서 서비스 추적자를 만들고 이벤트 관리 서비스를 추적 할 수 있습니다. 일단 코드를 얻으면 스레드를 만들어 코드를 실행합니다. 서비스가 사라지면 스레드가 인터럽트됩니다. 그러나 이것은 훨씬 더 복잡한 솔루션입니다.
다른 서비스 종속성 관리자도 있지만 주석을 사용하여 선언적 서비스를 강력히 권장합니다.