2011-07-28 2 views
1

OSGi 선언 서비스는 참조에 대해 일치하는 바인딩 해제 메소드를 사용하지 않고 명시 적으로 바인드 메소드를 가질 수 있으므로 "일단 구성 요소 구성이 비활성화되면 SCR은 구성 요소 인스턴스 및 활성화와 관련된 구성 요소 컨텍스트. "OSGi DS : Felix SCR을 사용하여 바인딩 해제 메소드 참조 주석

Java5 주석에서 서비스 컴포넌트 XML을 생성하기 위해 Apache Felix maven-scr-plugin을 사용하고 있습니다.

[ERROR] @Reference: Missing method unbind for reference configuration at Java annotations in <classname>:<linenum> 

가 왜 SCR 발생기가 너무 엄격한 것입니다 : 나는 @Reference 주석에서 "바인딩 해제"속성을 생략 할 경우, 나는이 실패를 얻을? 생략 된 바인딩 해제 방법을 허용하도록 지시 할 수있는 방법이 있습니까? 아마 내가 펠릭스에게 결함을 제기 할 필요가 있을까요?

물론 서비스에 사소한 바인딩 해제 메소드를 추가하는 것은 쉽지만 스펙에서는 불필요하다고 말합니다.

답변

3

견적을 보내신 텍스트 (112.5.13 개요 v4.2)는 바인딩 해제와 직접적으로 관련이 없으므로 비활성화를 말하며, 차례로 바인딩 해제가 필요합니다. 나중에 스펙 (112.5.15)에서는 "이벤트 전략을 사용하는 각 참조에 대해 해당 참조의 각 바인딩 된 서비스에 대해 바인딩 해제 메소드를 호출해야합니다."

편집 위의 무시하십시오. 아래의 설명을 참조하십시오. 현재 Felix SCR 버전에서는 "generateAccessors"가 기본적으로 활성화되어 있으므로 바인드/바인드 해제 메소드를 작성할 필요가 없습니다. 2011 년 7 월 IIRC는 그렇지 않았습니다.

+0

재미 있기 때문에 "반드시 호출해야합니다"라는 말은 바인딩 해제 메서드가 실제로 필요하다는 것입니다. 내 이해는 어쨌든 서비스 인스턴스가 삭제 될 것이므로 참조가 무효화되지 않으면 큰 문제가되지 않습니다. 그러나 그것이 틀렸을 수도 있습니다. –

+0

서비스 인스턴스가 프록시되어 있지 않으므로이를 버릴 수있는 유일한 방법은 null을 지정하는 것입니다. 번들을 제거하는 경우 전체 번들 (클래스 로더, 모든 클래스 및 인스턴스)이 가비지 수집되도록 번들의 클래스 로더에 의해로드 된 클래스의 모든 인스턴스를 무효화해야합니다. – earcam

+1

@Chris, 그냥 플러그인을 어지럽 혔습니다 - 거기에 구성 옵션 "generateAccessors"- 난 아직 시도하지 않은하지만 당신이 사실로 설정하면 유엔/바인딩 방법을 생성합니다 추측. – earcam

0

Bnd도 주석에서 DS XML을 생성하며이 제한이 없습니다.

1

사양에서 표준 DS 주석을 사용하는 경우 bnd가 XML을 생성하므로 별도의 Maven 플러그인이 필요하지 않습니다.

참고로 카디널리티가 필수 일지라도 참조 정책이 동적 인 경우 동적 바인딩을 처리해야 할 수 있으므로 항상 바인딩 해제 메소드를 사용해야합니다. 이 경우 bnd는 오류가 아닌 경고를 발생시킵니다.

참조 정책이 정적 인 경우 바인딩 해제 방법은 완전히 필요하지 않습니다. 이 경우 구성 요소 인스턴스를 반드시 삭제해야하므로 deactivate 메소드에서 정리 작업을 수행 할 수 있습니다.