0

メンテナンスを容易にし、新しいバンドルをより迅速に実装するために、いくつかのカスタム OSGI プラットフォームから Glassfish に移行しようとしています。

移行中に問題が発生しました。したがって、サービス参照を介して通信することになっている BundleA と BundleB があります。参照用のインターフェイスは、カスタム プラットフォームのメイン バンドルである BundleC にあります。BundleC がなければ、プラットフォーム自体を含め、何も開始されません。だから私はBundleCにインターフェースを置きました。BundleB にはインターフェイスを実装するクラスがあり、起動時にそれをサービスとして登録し、BundleA はそのサービスを使用します。

Glassfish に移行する間、適切な OSGI プラットフォームが既に提供されているため、古い BundleC は必要ありません。BundleC を削除した後、クラスのエクスポートとインポート、または起動用の 1 つのバンドルを含める以外に、適切なバンドル間通信を提供するにはどうすればよいでしょうか? BundleA と BundleB を「ほぼ」独立させ、結合させないようにしたいと考えています。

この場合の解決策はありますか? それとも、ある種のミドルウェアとして BundleC が必要ですか?

4

2 に答える 2

3

次の設定があると仮定します。

                     Service    
  +-------+                                +-------+
  |   A   |---get------|>---register-------|   B   |
  +-------+             .                  +-------+
      !                 .                     !
      !         [service package]             !
      !                 .                     !
      !             +-------+                 !
      \----import-->|   C   |<---import-------/
                    +-------+

これは、2 つのライフサイクルがあることを意味します。まず、A と B を C に対して解決する必要があります。C の目的は、A と B を互いに切り離すことです。C には唯一の共有部分であるインターフェイスが含まれているためです。したがって、純粋なカップリングの問題から、これは一般的にまったく悪いことではなく、多くの人が推奨しています。

ただし、このモデルの問題点は、インターフェースのみを含む非常に小さなバンドルがたくさんあることです (ただし、ミドルウェアと呼ぶのは無理があります)。

したがって、私は通常、バンドルの 1 つを選択して、サービス パッケージをエクスポートします。選択されたバンドルは、サービスのプロバイダーである必要があります。一般に、これはサービス インターフェイスの実装者です (ただし、そうである必要はありません。詳細については、OSGi Semantic Versioning Whitepaperを参照してください)。プロバイダーは、サービス インターフェイスのパッケージで定義されたサービス コントラクトを満たすバンドルです。サービスのプロバイダーはバンドル B である可能性があります。

バンドル B は、サービス インターフェイスのパッケージをエクスポートします。バンドル A はこのパッケージをインポートします。これにより、非常に優れた依存関係モデルが得られます。バンドル A はサービス インターフェイスのパッケージに依存しますが、バンドル B には依存しません。インターフェイスのパッケージの他のプロバイダーも同様に機能します。同時に、バンドル A は、少なくとも 1 つのプロバイダーがパッケージをエクスポートするまで開始されません。したがって、依存関係が管理された非常に優れたソリューションが得られ、必要なバンドルは 3 つではなく 2 つだけです。

  +-------+                                +-------+
  |   A   |---get------|>---register-------|   B   |
  +-------+             .                  +-------+
      !                 .                     ^
      !         [service package]             !
      !                 .                     !
      \----import-----------------------------/

bnd(tools) では、これは簡単です。サービス パッケージを Export-Package ヘッダーに追加するだけで、bnd はパッケージをクラス パスからバンドル B にコピーします。正しいバージョンを使用するために、パッケージの提供チェックボックスをマークしてください。輸入の範囲。

于 2013-08-07T06:50:33.907 に答える
1

私があなたのアーキテクチャを正しく理解していれば、あなたは正しいことをしていると思いますが、OSGI コンテナーとして Glassfish を使用しているため、サービス インターフェイスの定義を除いて、バンドル C には何も必要ありません。

バンドル C - サービス インターフェイスのみを定義する必要があります (実装は提供しません)。バンドル B - バンドル C によって定義されたサービス インターフェイスを実装し、そのインターフェイスのサービス プロバイダーとして OSGI コンテナーに自身を登録します。

バンドル A - バンドル C で定義されたサービス インターフェイスに依存します。

于 2013-08-07T06:55:07.637 に答える