2011-08-04 3 views
0

시스템에 장치를 정의하는 인터페이스가 있습니다. 장치는 한 번에 하나의 엔티티 만 사용할 의도가 있습니다. 나는 각 장치를 OSGi 서비스로 등록하여 다른 사람들이 그 메커니즘을 통해 (Declarative Services 또는 서비스 추적기를 사용하여) 장치에 액세스 할 수 있도록하고 싶습니다. 그러나, 내가 아는 한 그 메커니즘은 모든 엔티티가 동일한 서비스를 요청할 수있게합니다.OSGi에는 한 번에 하나의 서비스에만 액세스 할 수있는 방법이 있습니까?

첫 번째 요청자 만 서비스를 받거나 선언적 서비스를 사용하는 방법으로 한 서비스 구성 요소 만 만족할 수 있습니까?

답변

3

ServiceFactory를 사용하여 장치 서비스를 구현하십시오. 그런 다음 고유 한 서비스 객체를 각 번들에 반환 한 다음 해당 객체를 사용하여 액세스를 직렬화 할 수 있습니다. 현재 ServiceFactory는 현재 서비스에 액세스 할 수있는 다른 번들이있는 경우 다른 번들에 null을 반환 할 수 있습니다.

ServiceFactory를 사용하면 서비스 구현시 서비스를 사용하는 번들을 알 수 있고 서비스 사용을 제어 할 수 있습니다.

1

AFAIK DS를 사용하여 단일 소비자 정책을 적용 할 수 없습니다.

언뜻 보면 ServiceFactory일 수도 있고 일 수도 있고 가장 간단한 방법 일 것입니다.

Given Bundle A, Service S and Bundle B; 
A gets S, then A ungets S, Bgets S, then A gets S. 

프레임 워크의 캐시 잘 방해 캐시 S조차 생각 A가 이미 제공 할 수 있습니다 : "The Framework caches the value returned (unless it is null), and will return the same service object on any future call to BundleContext.getService for the same bundle. This means the Framework must not allow this method to be concurrently called for the same bundle"

그래서 내가 다음과 같은 경우에 실패합니다 생각 :

그러나 하나 caveat가있다 B가 보유하고 있습니다.

제가 생각할 수있는 유일한 대안은 FindHook을 사용하는 것입니다.이 방법은 좀 더 수준이 낮지 만 구현하고 싶을 수도 있습니다. 완성을 위해 다른 hooks (EventHook, ListenerHook).

후크를 사용하면 다른 번들에 서비스 가용성을 숨길 수 있습니다. 훅이 상태를 유지하기 때문에 장치 서비스와 동일한 번들로 원할 것이므로 장치 서비스의 번들을 중지하지 않고 훅을 중지하는 것은 불가능합니다.

+0

표준에도 "서비스 번들이 서비스 사용을 해제 할 때까지 ServiceFactory에 의해 반환 된 서비스 객체가 프레임 워크에 의해 캐시됩니다."그래서 나는 이것이 문제가 될 것이라고 생각하지 않습니다. –

+0

번들이 매번 새로운 인스턴스와 동시에 서비스를 사용해야하는 경우 어떻게해야합니까 ?? 어떻게 처리할까요? – Ravish

+1

안녕하세요 @ Ravz, 네 질문에 닐이 대답, 나는이 질문에 대한 답변으로 ComponentFactory의 예를 보았다. http://stackoverflow.com/questions/7033222/osgi-using-servicefactories/7080234#7080234 HTH – earcam