제가 알고 있듯이 OSGi 서비스는 사용 중일 때를 포함하여 언제든지 등록 해제 될 수 있습니다.JNI를 사용하는 OSGi 서비스가 사용 중 등록 해제되면 어떻게됩니까?
내부적으로 장기 실행 JNI 호출을하는 OSGi 서비스를 고려하십시오. JNI 호출이 실행되는 동안 서비스는 OSGi에 의해 등록 해제됩니다.
JNI 통화가 중간에 완료되거나 종료 될 수 있습니까? Java 호출을 실행하는 정상적인 비 jni라면? 해당 호출이 실행을 완료하도록 허용되거나 OSGi가 모든 것을 즉시 종료하고 등록을 취소합니까?
그런 경우 예상되는 동작은 무엇입니까? 서비스가 '트래커'를 사용하여로드되었는지 여부에 따라 예상되는 동작이 달라 집니까?
SG 심지어 "정상"(비 JNI) 서비스를 생각
감사합니다. 내 자신의 테스트가이 모든 것을 확인하는 것 같습니다. 장기간 실행되는 jni 및 non-jni 호출은 계속 실행되고 서비스 메소드에 대한 호출은 서비스 등록이 취소 된 후에도 수행 될 수 있습니다. –
서비스 인스턴스가 등록 해제 된 후에 서비스 메소드를 호출 할 수 있다는 것에 의존하는 것은 매우 위험합니다. 서비스 메소드가 어떤 클래스 로딩을 발생 시키면 (예를 들어, 코드 경로를 내려서 이전에 없었던) 클래스로드는 실패 할 것이고, 종종 호출하는 쓰레드를 그 클래스와 함께 사용하지 않을 것이다. 이를 처리하는 '올바른 방법'은 서비스 등록 취소를 계속하기 전에 장기 실행 호출이 끝날 때까지 시스템이 대기하도록하는 것입니다. –
@ James Branigan : 완전히 동의합니다. 나는 그 일을하기로되어 있지 않다고 썼다. 나는 규칙 뒤에 시행 할 마법의 배경이 없다는 점을 지적하기 바랐다. 서비스를 수동으로 조회하고 참조하는 대신 서비스 추적기 및 종속성 삽입과 같은 도구를 사용하는 것이 좋습니다. – Thilo