osgi バンドルを 1 日 4 回リロードする必要があるという要件があります。バンドルのリロードとは、静的インスタンス Bean の再作成、キャメル ルートのリロード、スレッド プールの再作成と注入、データベース接続プール ..etc(その他の spring xml のもの) を意味します。ssh を使用してバンドルを更新しようとしましたが、時間の経過とともに変更されるバンドル ID が必要でした。そこで、シンボル名でバンドルを取得し、1 日に 4 回更新する Manager Bundle を作成しました。
osgi impl : felix
container : apache-servicemix-4.4.1-fuse-03-06
Service Dependency spec : Blueprint
ヘルパー バンドルとともに 3 つのバンドルがあります。ヘルパー バンドルには、使用されるすべての共通クラスとサービス インターフェイスが含まれています。これら 3 つのバンドル間でコードを共有することはありません (いずれもパッケージをエクスポートしません)。それらはすべて camel vm エンドポイントとサービスを介して対話します。他の 3 つのバンドルを更新するだけで、ヘルパー バンドルはサービスを提供しません。
さて、問題は、これらの 3 つのバンドルで更新を行うたびに起動して正常に動作することですが、これを行うたびに jconsole で 800 ~ 900 クラスの増加が見られます。gc を強制しても、これらのオブジェクトがクリーンアップされないようです。では、これらの古い有線オブジェクトは何でしょうか? サービスの依存関係は自動的に更新されるはずで、バンドル間にコードの依存関係はありません。更新前後のクラス数の違いを確認しました。
org.apache.activemq.camel.component.VmComponent、 org.apache.commons.dbcp.BasicDataSource ..etc のようにいくつかのクラスの数が 2 倍になり、camel routes で定義したいくつかのカスタム Bean が表示されました。camel-core、blueprint、quartz...などのコンテナに依存しています。camel-contextのBean、VMエンドポイントなど、および更新時にblueprint-config xmlで定義されたコンポーネントに正確に何が起こりますか。bundle を更新したら、 FrameworkWiring.refreshBundles() を呼び出すことをお勧めします。しかし、私はバンドル間でコードを共有しておらず、他の依存関係コンテナーが処理する必要があると推測していますが、これは今では間違っていると思います。また、servicemix の現在のフェリックス フレームワーク実装が FrameworkWiring.refreshBundles() ( ref)、私はそれを機能させることができませんでした。この問題を解決するにはどうすればよいですか?
ありがとう sanre6