2013-07-29 3 views
1

여러 묶음으로 구성된 OSGi 애플리케이션을 개발 중입니다. 모두 EventAdmin에 의존합니다. 그러나 하나의 특정 플러그인은 번들이 시작되는 즉시 (예 : activator의 시작 메소드에서) 예약 된 작업을 시작해야합니다. 문제는 이벤트 관리 서비스가 아직 등록되지 않았기 때문에이 배포를 기다려야한다는 것입니다. 필자는 config 속성 파일을 통해이를 수행하고 싶지 않으므로 Felix의 등록 정보 파일없이이 작업을 수행 할 수 있습니까?다른 번들을 기다리는 방법은 무엇입니까?

덕분에 나는이에 대한 iPOJO을 사용했다

답변

0

사전에 많은. felix & 카라프에서 사용하도록 설계되었습니다. 이 라이브러리는 구성 요소의 수명주기 및 종속성을 이해하며 구성 요소 종속성을 사용할 수 있거나 하나 이상이 사라지면 @Validate 및 @Invalidate 메서드를 통해 통보됩니다.

서비스 (인터페이스) 구현이 나타나거나 사라지면 @Bind 및 @Unbind도 지원합니다. 이렇게하면 구독이 훨씬 간단 해집니다.

서비스에 대한 수신기가 있으며이 구성 요소는 호출 할 인터페이스를 제공합니다. 그런 다음 해당 구성 요소가 나타나면 @Bind 메서드에서 중앙 이벤트 레지스터가 호출되고 어떤 이유로 든 사라질 때 @Unbind가 호출됩니다.

나는 iPOJO가 당신이 필요로하는 모든 의존성 관리와 바인딩을해야한다고 생각합니다.

2

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 시작 메소드에서 서비스 추적자를 만들고 이벤트 관리 서비스를 추적 할 수 있습니다. 일단 코드를 얻으면 스레드를 만들어 코드를 실행합니다. 서비스가 사라지면 스레드가 인터럽트됩니다. 그러나 이것은 훨씬 더 복잡한 솔루션입니다.

다른 서비스 종속성 관리자도 있지만 주석을 사용하여 선언적 서비스를 강력히 권장합니다.

관련 문제