2012-05-12 10 views
2

현재 응용 프로그램에서는 몇 가지 위치에서이 패턴을 실행했습니다. 서로 다른 작업을 수행하는 단일 번들로 두 개의 서비스 인터페이스가 있습니다.OSGi 구성 요소 모델의 내부 및 내부 번들 종속성

interface Service1 { ... } 

interface Service2 { ... } 

및 싱글 구성 요소 모두를 구현해야하지만, 각각 다른에 대한 참조가 필요 찾으려면 :

public class Service1Impl implements Service1 { 

    private Service2 service2; 
    ... 

} 

public class Service2Impl implements Service2 { 

    private Service1 service1; 
    ... 

} 

세 개의 OSGi 프레임 구성 요소 모델 (DS, 청사진, 그리고 iPOJO)의 허용을 : 1) Service1ImplService2Impl이 같은 번들에있을 때; 2) 다른 번들에있을 때?

답변

5

서비스 선언적 사양, 버전 1.1 :

112.3.5 순환 참조

그것은 순환 종속성을 생성하는 구성 요소에 대한 설명 세트 가능하다. 예를 들어, 구성 요소 A가 구성 요소 B가 제공하는 서비스를 참조하고 구성 요소 B가 구성 요소 A가 제공하는 서비스를 참조하는 경우 구성 요소의 부분 활성화 된 구성 요소 인스턴스에 액세스하지 않으면 한 구성 요소의 구성 구성을 충족시킬 수 없습니다. SCR은 이 완전히 활성화 될 때까지 구성 요소 인스턴스가 에 액세스 할 수 없도록 보장해야합니다. 즉, 이 활성화 된 경우 반환됩니다. 본 경우 시도 성분 구성을 만족하고, SCR은 실패한다 사이클에 관련된 참조를 만족하고, 로그 서비스에 오류 메시지 로그 때

순환 참조는 SCR에 의해 검출되어야한다. 그러나 의 참조 중 하나에 선택적 카디널리티가있는 경우 SCR은주기를 중단해야합니다. 선택적 카디널리티가있는 참조를 만족하고 제로 대상 서비스에 바인딩 할 수 있습니다. 따라서 사이클이 끊어지고 다른 참조가 만족 될 수 있습니다.

종속성주기의 적어도 하나의 구성원이 속성이 아닌 인수 (121.2.6 순환 종속성) :

주기의 멤버는 구성 요소 인스턴스를 제공하도록 요청

, 청사진 컨테이너는주기의 멤버 하나 명 깨는 멤버를 찾아주기를 중단해야합니다. 분리 멤버는주기를 초래하는 종속성에 대해 특성 주입 을 사용해야합니다. 청사진 컨테이너는 부서 구성원을위한 사이클의 적절한 구성원 인 을 선택할 수 있습니다. 그러한 구성원이 없으면 초기화가 실패하거나 getComponentInstance 메서드가 구성 요소 정의 예외를 throw해야합니다.

위반 멤버는 개체를 제공하라는 메시지가 표시되면 부분적으로 초기화 된 구성 요소 인스턴스 을 반환해야합니다. 부분적으로 초기화 된 객체가 가능한 모든 초기화를 수행했지만 initMethod ( 이 지정된 경우)로 아직 호출되지 않았거나 사이클을 유발하는 속성을 주입하지 않았습니다. 부분적으로 초기화 된 구성 요소 인스턴스의 완료는 모든 참조 멤버에 분리 멤버가 삽입 될 때까지 이 지연되어야합니다. Finalization은 설정되지 않은 나머지 속성을 주입하고 initMethod가 지정된 경우이를 호출하는 것을 의미합니다.

부분적으로 초기화 된 구성 요소 인스턴스의 결과는 모든 속성이 설정되기 전에 을 사용할 수 있으므로 응용 프로그램은 을 알아야합니다.

청사진 컨테이너가 런타임 단계에 들어가기 전에 그리고 getComponentInstance 메서드를 호출하면 구성 요소 인스턴스가 반환되기 전에 부분적으로 초기화 된 모든 구성 요소 인스턴스를 완료해야합니다. getComponentInstance 메서드를 재귀 적으로 호출하여 동적주기를 발생시키는 사용자 코드 이 검색되어야하고 오류가 발생하면 이러한 주기를 파기 할 수 없습니다.

모든 감지 된주기를 기록해야합니다.

은 iPOJO

를 들어 특정 상황이 지원됩니다. 나는 다른 상황을 위해 를 이야기 할 수 없다.

(답이 메일 링리스트에 수신 됨).

3

엄밀히 말하면 순환 의존성 때문에 당신이 말하는 것은 불가능합니다.

Service1은 Service2가 활성화 된 후에 만 ​​작동 할 수 있으며 그 반대의 경우도 마찬가지이므로 프레임 워크에서 서비스를 시작할 수있는 순서가 없습니다.

지금까지 내가 당신이 당신이 선택 사양 서비스 참조 중 하나를 만들 경우 작동 할 수 있습니다 볼 수 있습니다, 그래서 다른 ServiceImpl에서는이 다시 서비스를 제공 할 수 있도록이 서비스를 주입 것 전에 그것의 서비스를 제공 할 수있다.

세 가지 프레임 워크 모두에서이 작업을 수행 할 수 있습니다. iPojo는 optional references이고 DS에는 서비스 요구 사항에 대한 카디널리티 설정이 있습니다 (1..1 대신 선택적 참조로 0..1 사용). 청사진 나는 그걸 잘 모른다. 그러나 나는 그것이 끝날 수 있다고 확신한다.

안부 프랭크

+0

"Service1은 Service2가 활성화 된 후에 만 ​​작동 할 수 있으며 그 반대의 경우도 있으므로 프레임 워크가 서비스를 시작할 수있는 순서가 없습니다." 프레임 워크는 게시하지 않고 두 인스턴스를 만들 수 있습니다 (클라이언트 코드로 호출 할 수없고 참조가 부족하지 않아도 됨). 그런 다음 게시하십시오. 또는 다른 인스턴스에 대한 참조없이 하나의 인스턴스를 게시하고 두 번째 인스턴스가 생성 될 때까지 모든 호출을 차단할 수 있습니다. 예 : 이것은'@ Autowired' Spring 빈과 잘 동작합니다. –

+0

DS 사양을 보면 실제로 다른 서비스는이 상황에서 다시 제공되지 않습니다 (112.3.5 참조). –

+0

iPOJO도이 경우를 처리하기 위해 시간적 종속성이 있습니다. – Clement