2012-04-18 10 views
7

하루에 4 번 osgi 번들을 다시로드해야하는 경우가 있습니다. 번들을 다시로드하는 것은 정적 인스턴스 Bean을 다시 만들고, 낙타 경로를 다시로드하고, 스레드 풀을 다시 만들고 주입하는 것을 의미합니다. 데이터베이스 연결 풀 ..etc (기타 스프링 XML 항목). 나는 ssh를 통해 내 번들을 새로 고치려고했지만 시간이 초과 될 수있는 번들 ID가 필요했습니다. 그래서, 내가 상징적 인 이름으로 번들을 얻고을 새로 고치는 관리자 번들 4 회osgi 번들 업데이트 문제

  osgi impl : felix 

      container : apache-servicemix-4.4.1-fuse-03-06 

      Service Dependency spec : Blueprint 

모든 일반적인 클래스를 사용하고있다 도우미 번들 국지적 도우미 번들과 함께 3 번들이되어 낮과 서비스를 썼다 인터페이스. 이 3 개의 번들 간에는 코드 공유가 없습니다 (패키지를 내보낼 수있는 것은 없습니다). 모두가 낙타 VM 엔드 포인트 및 서비스를 통해 상호 작용합니다. 다른 3 개의 번들 만 새로 고치고 도우미 번들은 서비스를 제공하지 않습니다.

이제는 3 번들에 대한 업데이트를 시작하여 정상적으로 작동하지만 문제는 jconsole에서 매번 800-900 클래스가 증가하는 것을 볼 수 있습니다. 강제로 gc도 이러한 개체를 정리하지 않는 것 같습니다. 그렇다면이 오래된 유선 객체는 무엇이 될 수 있습니까? 서비스 종속성은 자동으로 업데이트되어야하며 번들 간에는 코드 종속성이 없습니다. 업데이트 전후의 클래스 수 차이를 확인했습니다.

내가 어떤 클래스의 수를 볼 수

은 두 배로 org.apache.activemq.camel.component.VmComponent, org.apache.commons.dbcp.BasicDataSource 같은 .. 등 및 일부 사용자 지정 콩이 나는 내 낙타 루트에 정의되어 있습니다. 나는 camel-core, 청사진, 석영 등을위한 컨테이너에 의존한다. bean, VM endpoints와 정확히 어떻게 다른가? camel-context와 blueprint-config xml에 정의 된 컴포넌트가 업데이트된다. 번들을 업데이트하면 FrameworkWiring.refreshBundles()를 호출하는 것이 좋습니다. 하지만, 번들 사이에 코드를 공유 할 필요가 없으며 컨테이너가 다른 종속성 컨테이너를 처리해야한다고 생각합니다. 그리고 Servicemix의 현재 felix 프레임 워크 구현이 FrameworkWiring.refreshBundles() (ref)를 지원하는지 잘 모르겠지만 작동시키지 못했습니다. 이 문제를 어떻게 해결할 수 있습니까?

감사 sanre6

+0

이전 번들 인스턴스의 스레드가 있습니다. – artbristol

+0

예. 숫자가 두 배로 증가했습니다. 번들을 업데이트하기 전에 인스턴스를 닫고 낙타 경로를 종료해야한다고 말하고 있습니까? – sanre6

+0

동일한 문제가 발견되었습니다. 춘분 구현으로 전환하면이 문제가 사라지고 Felix OSGI 컨테이너 문제가 의심됩니다. –

답변

0

나는 낙타에 대해 잘 모르지만 당신이 클래스를 번들로 참조보다 Runnable와 플랫폼을 제공하는 경우, 당신은 확실히 그들은 모두 새로 고침 파괴 취소하거나 취득 할 필요가, 실행중인 스레드는 이전 클래스 인스턴스 (실제로는 동일하더라도 클래스 번들 인스턴스와 다름)에 대한 참조를 보유하기 때문입니다. 따라서, 학급 수가 증가합니다.

+0

내 응용 프로그램은 크게 servicemix 번들에 의존하고 최선의 방법은 컨테이너가 의존성을 처리하고, 이러한 모든 종속성을 확인하고,이를 해결하는 것이 많은 고통스러운 작업이 될 것이라고 믿습니다. 코어 osgi를 제거 할 수 있는지 확실하지 않습니다. 번들 업데이트 전에 청사진 관련 의존성 파악 – sanre6

1

일반적으로 번들에서만 업데이트를 호출하는 것만으로는 충분하지 않습니다. 어떤 시점에서 패키지를 새로 고쳐야합니다. 모든 것이 정상적으로 작동하면 모든 패키지 배선을 업데이트하기에 충분하므로 이전 버전의 번들을 가비지 수집 할 수 있습니다. 그러나 번들 중 하나에 잘 작동하지 않는 스레드가 있고 캐시 또는 다른 스레드에서 리소스가 계속 실행되는 경우 문제를 추적하기 시작해야합니다. 좋은 프로파일 러를 얻고,이 "여분"객체가 속한 번들과 클래스 로더를보고 거기에서부터 이동하십시오.