4

編集:この質問を最新の情報で更新しました...

依存する機能に対して "features:uninstall" コマンドを連続して実行すると問題が発生します。OSGi は「状態変更が進行中です...」と応答しますが、他の要求を受け入れると、問題が発生します。

奇妙なことに、これにより機能のアンインストールは成功しますが、バンドルのアンインストールは失敗します。アンインストール リクエストを適切に並べ替え、ステップ間に遅延を追加することで、この問題に対処していますが、より堅牢なソリューションを期待しています。

示唆されているように、ステップの間に「osgi:refresh」を追加しようとしました...同じ動作です。「パッケージの更新」がまだ実行されていることを検出して、後続のリクエストなどを遅らせる別の方法はありますか?

詳細はこちら...

karaf@root> features:uninstall PolicyUtil  
karaf@root> features:uninstall Policy1  
karaf@root> features:uninstall Policy2    
State change in progress for bundle "file:/policy2.jar" by thread "Refresh Packages".  
karaf@root> features:uninstall Policy3  
State change in progress for bundle "file:/policy3.jar" by thread "Refresh Packages".  
karaf@root> features:uninstall Policy4  
karaf@root> features:uninstall Enabler1    
State change in progress for bundle "file:/enabler1.jar" by thread "Refresh Packages".    
karaf@root> features:uninstall Enabler2  
State change in progress for bundle "file:/enabler2.jar" by thread "Refresh Packages".  

afterwards...we end up with features uninstalled (correct), but some bundles still installed (incorrect)

osgi:list

[ 277] [Installed  ] [            ] [       ] [   60] Policy2  
[ 278] [Installed  ] [            ] [       ] [   60] Policy3  
[ 280] [Installed  ] [            ] [       ] [   60] Enabler1  
[ 281] [Installed  ] [            ] [       ] [   60] Enabler2  

features:list

[uninstalled] [1.0                 ] PolicyUtil                           repo-0  
[uninstalled] [1.0                 ] Policy1                              repo-0  
[uninstalled] [1.0                 ] Policy2                              repo-0  
[uninstalled] [1.0                 ] Policy3                              repo-0  
[uninstalled] [1.0                 ] Enabler1                             repo-0  
[uninstalled] [1.0                 ] Enabler2                             repo-0  
4

5 に答える 5

6

どのような例外が発生するかはわかりませんが、1 つのことに注意してください。 のようなシェル コマンドを使用してバンドルをアンインストールするとosgi:uninstall、効果的に が呼び出されますBundle.uninstall()。そこにある Javadoc で読めるように、これがすべてではありません。

フレームワークは、フレームワークの残りの部分への影響を最小限に抑える操作を優先するため、関連するすべてのパッケージを削除せずにバンドルをアンインストールできます。本当にすべてを削除したい場合は、osgi:refreshコマンドを使用する必要があります。詳細については、Felix FAQを参照してください。

私ができる最善のアドバイスは、uninstall互いに交差する可能性のある複数のリクエストを発行しないことです。バンドルのセットを削除したい場合は、交差しないuninstall()リクエストを送信し、その後に単一のrefreshPackages(). また、単一のシステムで「通常の」コンソールと Karaf を使用したバンドル管理を混在させません。

バンドルのインストールと削除に外部マネージャーを使用することも検討できます。リモート管理が必要な場合は、Apache ACEを使用できます(開示: 私は Apache ACE コミッターです)。

于 2010-12-28T14:29:09.960 に答える
2

または...次のコマンドでアプリを簡単にアンインストールできます。

カラフ 2.2.x:

osgi:uninstall --force yourapp-feature/0.0.1.SNAPSHOT

于 2013-02-11T13:00:49.383 に答える
1

わかりました、私はこれを掘り下げていて、問題とオプションを理解していると思います...応答に感謝します。

「features:uninstall [name]」が実行されると、bundle.uninstall() が呼び出され、その後、フィーチャー内の各バンドルに対して refreshPackages() が呼び出されます。次に、すべてのバンドルがアンインストールされた後、すべてのバンドルに対して refreshPackages() を呼び出します。問題は、refreshPackages() が ( OSGi 仕様に従って) 非同期であり、バンドルが解決状態のままになることです。解決機能/バンドルをアンインストールするための後続の要求は、期待どおりに完了しません。

アンインストールの間に十分な遅延がある場合、または後でアンインストールが実行された場合 (refreshPackages() が完了した後)...すべてが期待どおりに機能します。

オプション...

  1. アンインストール中に依存する機能/バンドルを注文する (制御が難しい)
  2. アンインストールコマンドの間に遅延を入れます(正確ではありません)
  3. 期待される機能/バンドルがアンインストールされていることを確認します (または待機を続けます)
  4. FrameworkEvent.PACKAGES_REFRESHED イベントをリッスンします (イベントはコンテナー全体であるため、複雑で保証されていません。この例を参照してください)
  5. パッケージを同期的に更新するためのオプションをサポートするように Karaf/Felix を変更します ( Karaf 2.1.3に関するこの問題/解決策を参照してください)。
于 2011-01-07T17:30:18.263 に答える
0

私の経験では、これは、バンドルのリソースがまだ別のバンドルによって参照または使用されている場合に発生します。この場合、フレームワークはバンドルを削除できず、jar ファイル全体が引き続き VM によって処理されます。

すべての参照が削除されていることを確認してください。よくある間違いは、バンドルでインスタンス化されたオブジェクトの 1 つでまだスレッドを実行していることです。これは、削除できないリソースがまだ使用中の広告としてもカウントされます。

于 2010-12-28T02:28:54.347 に答える