7

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.VmComponentorg.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

4

2 に答える 2

1

一般に、バンドルの更新を呼び出すだけでは十分ではありません。ある時点で、パッケージも更新する必要があります。すべてが正常に動作している場合は、すべてのパッケージワイヤリングを更新するのに十分であり、バンドルの古いバージョンをガベージコレクションすることができます。ただし、バンドルの1つに正常に動作しないものがあり、スレッドの実行を維持したり、キャッシュなどのリソースを使用したりする場合は、問題の追跡を開始する必要があります。優れたプロファイラーを入手し、これらの「余分な」オブジェクトがどのバンドルとクラスローダーに属しているかを確認し、そこから移動します。

于 2012-09-24T22:48:11.340 に答える
0

Camelについてはよくわかりませんが、バンドルクラスを参照するランナブルをプラットフォームに提供している場合は、実行中のスレッドが保持するため、更新時にすべてがキャンセルされるか、破棄されることを確認する必要があります。古いClassインスタンスへの参照(実際には同じですが、新しいバンドルのClassインスタンスとは異なります)。したがって、クラス数を増やします。

于 2012-04-19T06:11:19.043 に答える