2012-04-18 17 views
7

私はosgiバンドルを1日に4回リロードする必要があります。バンドルのリロードは、静的インスタンスBeanの再作成、ラクダルートの再ロード、スレッドプールの再作成と注入、データベース接続プールなどを意味します。私はsshでバンドルをリフレッシュしようとしましたが、残業時間が変わるバンドルIDが必要でした。だから、私はヘルパーバンドル【選択ヘルパーバンドルと一緒に3つのバンドルがあります。1日4回osgiバンドルのアップデートに関する問題

  osgi impl : felix 

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

      Service Dependency spec : Blueprint 

をシンボル名でバンドルを取得し、それらを更新しマネージャバンドルを書いたすべての共通 使われるクラスおよびサービスを提供していますインターフェイス。これら3つのバンドルの間でコードを共有することはありません(いずれもパッケージをエクスポートしません)。それらのすべてがcamelのVMエンドポイントおよびサービスを介して相互作用します。私は他の3つのバンドルをリフレッシュし、ヘルパーバンドルはサービスを提供しません。

問題は、起動してうまく動作するこれらの3つのバンドルのアップデートを行うときですが、これを行うたびにjconsoleで800-900クラスの増加が見られます。 gcを強制することも、これらのオブジェクトをクリーンアップしていないようです。だから、これらの古い有線オブジェクトは何ができますか?サービスの依存関係は自動的に更新され、バンドル間のコードの依存関係はありません。更新後と更新前のクラスの数の違いを確認しました。

私はいくつかのクラスのカウントが org.apache.activemq.camel.component.VmComponent、 私 org.apache.commons.dbcp.BasicDataSource ..etcといくつかのカスタム豆のように倍増している見ることができました

私のラクダのルートで定義されています。私はキャメルコア、青写真、石英などのコンテナに依存しています。豆、VMエンドポイントなどには何が起こりますか?ラクラのコンテキストやblueprint-config xmlのアップデート時に定義されているコンポーネントです。バンドルを更新したら、FrameworkWiring.refreshBundles()を呼び出すことをお勧めします。しかし、私はバンドルの間でコード共有を持っていないと私は間違っていると思う他の依存関係のコンテナを処理する必要があります。そして、servicemixの現在のfelixフレームワークの実装がFrameworkWiring.refreshBundles()(ref)をサポートしているかどうかはわかりません。どうすればこの問題を解決できますか?

おかげ sanre6

+0

古いバンドルインスタンスのスレッドがぶら下がっていますか? – artbristol

+0

はい、その数は倍増しています。バンドルを更新する前に私のインスタンスを閉じてラクダのルートをシャットダウンする必要があると言っていますか? – sanre6

+0

同じ問題が見つかりました。分かりにくい実装に切り替えると、この問題は消えてしまい、Felix OSGIコンテナの問題が疑われます。 –

答えて

0

、私はキャメルについて多くを知らないが、あなたはクラスをバンドルを参照してくださいランナブルとプラットフォームを提供している場合、あなたは彼らがすべてキャンセルまたはその他のリフレッシュに破壊され得ることを確認する必要があります実行中のスレッドには古いClassインスタンス(実際には同じでも新しいバンドルのClassインスタンスとは異なる)への参照が保持されるためです。したがって、クラス数を増やす。

+0

私のアプリケーションはservicemixバンドルに大きく依存しています。ベストプラクティスは、コンテナがあなたの依存関係を処理し、これらの依存関係をすべて特定し、それらをクリアすることは苦労します。コアosgiを削除できるかどうかはわかりませんバンドルを更新する前にブループリント関連の依存関係 – sanre6

1

一般に、バンドルの更新を呼び出すだけでは不十分です。ある時点でパッケージを更新する必要があります。すべてが正常に動作していれば、すべてのパッケージ配線を更新するのに十分なはずです。これにより、古いバージョンのバンドルを効果的にガベージコレクションすることができます。しかし、バンドルの中にうまく動作せず、キャッシュや何かの中でスレッドが実行されていたり、何らかのリソースが残っているバンドルがあれば、問題の追跡を開始する必要があります。良いプロファイラを手に入れ、これらの "余分な"オブジェクトがどのバンドルとクラスローダーに属しているかを確認してそこから移動してください。

関連する問題