2010-03-17 7 views
2

제가 알고 있듯이 OSGi 서비스는 사용 중일 때를 포함하여 언제든지 등록 해제 될 수 있습니다.JNI를 사용하는 OSGi 서비스가 사용 중 등록 해제되면 어떻게됩니까?

내부적으로 장기 실행 JNI 호출을하는 OSGi 서비스를 고려하십시오. JNI 호출이 실행되는 동안 서비스는 OSGi에 의해 등록 해제됩니다.

JNI 통화가 중간에 완료되거나 종료 될 수 있습니까? Java 호출을 실행하는 정상적인 비 jni라면? 해당 호출이 실행을 완료하도록 허용되거나 OSGi가 모든 것을 즉시 종료하고 등록을 취소합니까?

그런 경우 예상되는 동작은 무엇입니까? 서비스가 '트래커'를 사용하여로드되었는지 여부에 따라 예상되는 동작이 달라 집니까?

SG 심지어 "정상"(비 JNI) 서비스를 생각

답변

3

은은 OSGi는 이미 진행되고있는 처리를 중지하지 않습니다. 실제로, 번들이 서비스 인스턴스에 대한 참조를 어떻게 등록 해제했는지 (그것이 수행되지 않아야 함) 유지한다면, 그 객체에 대한 메소드를 여전히 호출 할 수 있습니다 (서비스가 계속 작동하는지 여부는 전적으로 서비스 구현).

OSGi 서비스에는 "마법"이 없습니다. 번들 라이프 사이클은 서비스 레지스트리에 등록되거나 등록 해제되는 것을 제어합니다. 일단 서비스 구현에 대한 참조가 있으면, 그것은 아주 오래된 Java 메소드 호출 일뿐입니다.

그래서 번들 (또는 서비스) 자체가 진행중인 활동을 종료하기 위해 어떤 조치도 취하지 않으면 질문에 대답하기 위해 장기 실행 호출이 완료됩니다.

+0

감사합니다. 내 자신의 테스트가이 모든 것을 확인하는 것 같습니다. 장기간 실행되는 jni 및 non-jni 호출은 계속 실행되고 서비스 메소드에 대한 호출은 서비스 등록이 취소 된 후에도 수행 될 수 있습니다. –

+0

서비스 인스턴스가 등록 해제 된 후에 서비스 메소드를 호출 할 수 있다는 것에 의존하는 것은 매우 위험합니다. 서비스 메소드가 어떤 클래스 로딩을 발생 시키면 (예를 들어, 코드 경로를 내려서 이전에 없었던) 클래스로드는 실패 할 것이고, 종종 호출하는 쓰레드를 그 클래스와 함께 사용하지 않을 것이다. 이를 처리하는 '올바른 방법'은 서비스 등록 취소를 계속하기 전에 장기 실행 호출이 끝날 때까지 시스템이 대기하도록하는 것입니다. –

+0

@ James Branigan : 완전히 동의합니다. 나는 그 일을하기로되어 있지 않다고 썼다. 나는 규칙 뒤에 시행 할 마법의 배경이 없다는 점을 지적하기 바랐다. 서비스를 수동으로 조회하고 참조하는 대신 서비스 추적기 및 종속성 삽입과 같은 도구를 사용하는 것이 좋습니다. – Thilo

관련 문제