2012-10-16 2 views
1

번들 A, 번들 B 및 번들 C라고하는 세 번들로 구성된 GUI (스윙) 응용 프로그램을 구현 중입니다. BundleContext.installBundle (String location) 메소드를 사용하여 별도의 설치 프로그램 번들을 사용하여 /에이 세 번들을 모두 설치합니다.OSGi 번들 업데이트가 이전 번들을 중지/언로드하지 않는 이유는 무엇입니까?

"UpgradeBundle"이라는 다른 번들을 사용하여 이미 설치된 3 개의 번들 중 하나를 업데이트 할 때 문제가 발생합니다. 더 정확히 말하면 FrameworkWiring.refreshBundles (BundlesForRefresh, null) 메서드를 호출 한 다음 BundleC.update (null) 메서드를 호출합니다.이 번들 업데이트를 읽으려면 FrameworkWiring.refreshBundles가 필요합니다. 그러나 FrameworkWiring.refreshBundles를 호출하면 이미 실행중인 응용 프로그램 인스턴스에서 업데이트하는 대신 업데이트 된 번들로 새 GUI 응용 프로그램이 시작되고 이미 실행중인 응용 프로그램은 이전 번들과 함께 계속 실행됩니다. 왜 이런 일이 일어나는 지 아십니까?

문제에 대한 자세한 설명이 필요하면 알려주세요. 문제를 자세히 설명하려고합니다.

P. 나는 Equinox OSGi 프레임 워크를 사용하고있다.

답변

2

새로 고침은 업데이트 된 번들의 이전 버전에 대한 참조가있는 모든 번들을 중지합니다. stop 메서드가 호출 될 때 응용 프로그램이 기존 인스턴스를 제대로 종료하지 않는 것 같습니다. 그런 다음 start 메소드가 새 메소드를 작성합니다.

업데이트 할 때 앱이 종료되지 않도록하려면 앱에서 업데이트 된 번들에 대한 클래스 로더 참조가 없도록주의해서 시스템을 설계해야합니다. 인터페이스를 중점적으로 다루는 서비스는이를 달성하는 훌륭한 방법입니다. 그러나 결국에는 참조를 새로 고치려면 앱을 종료해야하는 경우가 많습니다.

+0

안녕하세요 @Peter 귀하의 회신에 대단히 감사합니다. 예. 내 앱이 번들 라이프 사이클 관리 측면에서 나쁘게 설계되었음을 알고 있습니다. 나는 이것을 파헤쳐 볼 것이다. 더 나아가 나는 업데이트하려고하는 bundleC가 실제로는 조각이라는 것을 깨달았습니다. (bundleA에 기여하고 자체 activator가 없습니다.) 이것은 또 다른 질문으로 이어집니다. 번들을 업데이트하는 것과 프래그먼트를 업데이트하는 것 사이에 중요한 차이가 있습니까? – Nadeem

관련 문제