2014-06-14 4 views
0

다른 번들에서 서비스를 호출하기 전에 NPE를 얻을 것이므로이 서비스 가용성을 검색하고 싶습니다.OSGI 서비스 참조

서비스를 검색하는 적절한 방법은 무엇입니까?

ServiceReference serviceReference = bc.getServiceReference(someclass.class.getName()); 
      if (serviceReference == null) 
      { 
       throw new RuntimeException("Missing service someclass, please start bundle <name>"); 
      } 
      else 
      { 
       kernelsManager = (someclass) bc.getService(serviceReference); 
      } 

서비스를 찾을 수없는 경우 프레임 워크를 종료하고 싶습니다. 이 일을 올바르게하는 것은 무엇입니까? 위의 예를 어떻게 든 향상시킬 수 있습니까?

답변

3

이것은 OSGi 에서처럼 쉽지 않습니다. 서비스를 포함하는 번들은 서비스를 사용하는 번들 이후에 시작될 수 있으므로 해당 동적을 설명해야합니다. 서비스가 단일 시점에 존재하는지 단순히 확인하는 것만으로는 충분하지 않습니다.

ServiceTracker를 사용하여이 작업을 수행 할 수 있습니다. 서비스가 추가되면 이에 종속 된 고유 한 클래스를 초기화합니다. 그것이 아래로 간다면 당신은 그것을 멈춘다. 하나 이상의 서비스 의존성이 있다면 이것은 매우 복잡합니다.

그래서 더 큰 경우에는 선언 서비스 (Declarative Services) 나 청사진 같은 프레임 워크를 사용하는 것이 더 좋습니다.

2

기독교인의 답변에 덧붙여 서비스가 이용 가능하지 않기 때문에 단순히 프레임 워크를 종료하는 것은 나쁜 습관입니다. OSGi는 디자인에 따라 동적입니다. 서비스가 올 수도 있고 갈 수도 있기 때문에 번들은 서비스가 (아직) 사용 가능하지 않거나 사라지고 다시 나타납니다. 그렇지 않으면, 처음에는 OSGi를 사용하는 목적이 정말로 보이지 않습니다.

+0

질문이 하나 더 있습니다. 서비스를 이용할 수없는 경우 어떻게 번들을 멈출 수 있습니까? –

+0

아직도 좋은 습관이 아니라 선언적 서비스 또는 'ServiceTracker'를 통해 서비스를 추적해야하지만 Bundle.stop을 사용하여 번들을 중지 할 수 있습니다. –

+0

선언적 서비스를 사용하는 경우 외부 서비스에 종속 된 클래스가 사용 가능 해지면 시작되고 서비스가 사라지면 중지됩니다. 청사진은 역동적이지는 않지만오고가는 서비스를 처리 할 수 ​​있습니다. –

관련 문제