2010-02-04 3 views
29

지금 당분간 OSGi를 사용하고 있으며 발생한 문제에 대한 다양한 해결책을 가지고 있습니다. 나는이 중 하나를 다시보고 사람들이 다른 해결책을 찾았는지보기를 원했다.OSGi의 스레드 컨텍스트 ClassLoader 처리 개선

내가 OSGi (Equinox 3.4.2)에서 가지고있는 가장 일반적인 문제 중 하나는 스레드의 컨텍스트 ClassLoader를 자주 사용할 수 없다는 것입니다. 이 부분적으로 춘분 문제이지만, 필릭스와도 문제가 있습니다. 나는 주로 자신의 쓰레드 (Threads) 또는 쓰레드 풀 (ThreadPools)을 시작하는 써드 파티 라이브러리와이를 만난다. 이러한 번들 또는 DS 활성화 중에 시작되면 ClassLoader없이 종료 될 수 있습니다. 타사 라이브러리에 문맥 ClassLoader가없는 것에 대한 경비원이있는 경우 문제는 없지만 모든 사람이 확인하지는 않습니다. 나중에 해당 라이브러리가 동적 클래스 로딩을 수행해야하는 경우 파열 될 수 있습니다.

ClassLoader tccl = Thread.currentThread().getContextClassLoader(); 
try { 
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 
    /* 
    * Start threads, or establish connections, here, now 
    */ 
} finally { 
    Thread.currentThread().setContextClassLoader(tccl); 
} 

이 관용구 보통 활성제의 끝 또는 DS() 메소드를 활성화 :

I 잠시 동안 사용 된 관용구는 다음 (짧게)이다. tccl이 null이 아니고 컨텍스트 클래스 로더를 재정의하지 않는지 확인하는 경우에는 약간의 변형이 있습니다.

이제 제 3 자 라이브러리가 스레드를 생성하고 내 하루를 망칠 수도 있다는 것을 알고있는 여러 장소에이 코드를 붙여 놓았습니다. 처음에는 관리가 가능했지만 많은 무작위 장소에서이 작업을 마쳤습니다.

이 문제로 고통받는 사람은 누구이며 어떤 해결책이 있습니까? 또한 새로운 Equinox 3.5.x에서이 문제가 해결되었는지 여부와 실제로 작동하는지 여부를 알고 싶습니다.

감사합니다.

답변

12

위대한 질문으로, 우리는 (Felix/Karaf/Servicemix4.2에서) 비슷한 해결책을 찾아보다 나은 해결책을 찾고있었습니다. 여기에 다시 펠릭스 팀으로부터받은 응답 ...

http://old.nabble.com/Can-the-thread-context-classloader-issue-be-solved-at-all--td28260809.html#a30704352

는 본질적으로, 그들은 순간에 더 나은 해결책이 아니라고 말할이다. 사람이 다른 옵션 또는 로드맵 알고있는 경우

그러나, 나는 ... 춘분은 "버디 정책"을 포함하고 여기에 "컨텍스트 찾기"를 사용하여 몇 가지 다른 옵션을 참조하는

http://wiki.eclipse.org/Context_Class_Loader_Enhancements

보이나요 앞으로이 문제를 해결하려면 알려 주시기 바랍니다.

+0

거의 1 년 만에 첫 번째 답변! +1. 그러나 예, 펠릭스 팀이 권장하는 것은 제가 이미하고있는 것입니다. Context Finder는 Equinox 3.6과 함께 도착 했으므로 질문 당시에는 사용할 수 없었습니다. 그러나 Context Finder를 사용하려고 시도했지만 항상 제대로 작동하지 않는다는 사실을 발견했습니다. – omerkudat

+0

당신은 아마 "tumbleweed"배지를 가지고 있습니다. 보통 OSGi 문제 인 것 같습니다. –