2012-04-18 66 views
7

我有,我需要重新加載我的OSGi包,每日4次的要求。重新加載bundle意味着重新創建靜態實例Bean,重新加載駱駝路由,重新創建和注入線程池,數據庫連接池..等(其他spring xml東西)。我試圖通過ssh刷新我的捆綁軟件,但是我需要捆綁標識來改變加班時間。所以,我寫了一個經理一束,用符號名稱得到束和刷新他們每天有與助手捆綁.The幫手束沿着3根已使用問題與更新OSGi包

  osgi impl : felix 

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

      Service Dependency spec : Blueprint 

所有常見 類和服務4倍接口。這3個軟件包中沒有代碼共享(它們都不導出任何軟件包)。它們都通過camel vm端點和服務進行交互。我只刷新了其他3個捆綁軟件,並且幫助器捆綁軟件不提供任何服務。現在

,問題是當過我做他們的啓動和正常工作這3包的更新,但我看到每次我這樣做的時候800-900課上的JConsole的增加。強制gc似乎也沒有清理這些對象。那麼,這些舊有線物體會是什麼?服務依賴關係應該被自動更新,並且bundle之間沒有代碼依賴關係。我在更新之前和之前檢查了類的數量差異。

我可以看到一些類中的數量已經翻了一番像org.apache.activemq.camel.component.VmComponentorg.apache.commons.dbcp.BasicDataSource ...等和一些自定義的豆,我已經在我的駱駝路線中定義了。我很依賴駱駝核心,藍圖,石英...等。什麼容器上正好發生在豆,VM endpoints..etc在駱駝上下文和組件藍圖配置XML的定義上的更新。我知道它建議您在更新捆綁軟件後調用FrameworkWiring.refreshBundles()。但是,我沒有代碼共享捆綁之間,我推測任何其他依賴容器應該處理我認爲現在是錯誤的。而且我不知道,如果在ServiceMix的當前費利克斯框架實現支持FrameworkWiring.refreshBundles()(ref),我是不是能夠得到它的工作。我該如何解決這個問題?

感謝 sanre6

+0

你有沒有從舊的包實例掛線程? – artbristol 2012-04-18 07:54:03

+0

是的,他們的人數增加了一倍。你是否想說我必須關閉我的實例,在更新捆綁之前關閉駱駝路由? – sanre6 2012-04-19 06:01:41

+0

我們發現相同的問題。切換到equinox實現使這個問題消失,然後我懷疑Felix OSGI容器的問題。 – 2015-03-10 10:55:19

回答

0

我不知道很多關於駱駝,但如果您提供的信息平臺,其指的捆綁類可運行,那麼你需要確保它們都被取消或以其他方式銷燬刷新,因爲它們運行的​​線程將持有對舊的Class實例的引用(這與新捆綁的Class實例不同,即使它們實際上是相同的)。因此,增加班級數量。

+0

我的應用程序嚴重依賴於servicemix包,我相信最好的做法是讓容器處理你的依賴關係,識別所有這些依賴關係並清除它們將會是很多痛苦的工作。我甚至不確定你是否可以刪除核心osgi以及在更新包之前設計藍圖相關的依賴關係 – sanre6 2012-04-19 06:53:46

1

一般來說,只有上包調用的更新是不夠的。你必須在某個時候刷新你的軟件包。如果每件事情都表現良好,那應該足以更新所有包裹接線,有效地允許舊版本的包被垃圾收集。但是,如果某個捆綁包中的某些行爲不正常,並且線程正在運行或緩存中存在某些資源,則必須開始追蹤該問題。讓自己成爲一個好的分析器,看看這些「額外」對象屬於哪個bundle和classloader並從那裏去。