1

次のシナリオを実装したいと思います。

エクステンダーは拡張機能を使用しますが、拡張機能は自分のタイプによってグループ化されます。例: Extender = Vendor および Extensions = HotDogSeller1、HotDogSeller2、PopcornSeller。私のポイントは、クライアント (顧客) が HotDogs または Popcorns のいずれかを購入したいということですが、彼は負荷の少ない HotDogSeller (より小さなキュー) を選択します。

私は OSGi を初めて使用するので、これを実装するためのベスト プラクティスは何ですか? iPojo で Apache Felix を使用できると思います (それはエクステンダー パターンです)。これには 2 つの問題があります。

  • 同じバンドルを 2 回インストールする必要があります (ホットドッグの実装では、それぞれに独自のキューの長さがあります)
  • どういうわけか、同じ種類 (ホットドッグ、ポップコーン) のバンドルをグループ化します。これは、HotDogSeller1 と HotDogSeller2 を区別するための「番号」などのキーを持つバンドルのプロパティを作成することで実行できます)。
  • 4

    1 に答える 1

    1

    エクステンダーパターンを悪用しようとしていると思います。主な特徴の 1 つは、エクステンダー パターンが本質的に静的であることです。つまり、バンドルがインストールされるとすべてが発生します。これはあなたの場合ではないようです。同じ実装に複数のキューがあると、それらのキューの背後にサービスがあると思います。サービスの数は動的に変化する可能性があるため、エクステンダーはこれには十分に対応できません。

    ホワイトボード柄を使った方が良いと思います。(リスナーメカニズムを対象としているという事実は無視してください)。アイデアは、各バンドルがリクエストを処理できるサービスを提供するということです。を使用して、利用可能なすべてのサービスを追跡しますServiceTacker。リクエストを処理する必要がある場合は、利用可能なすべてのサービスを反復処理し、それらが無料かどうかを尋ねます (これを内部で処理することを選択し、サービス実装とこれをネゴシエートしないでください)。無料のサービスが見つかったら、リクエストを転送します。

    プロパティ「タイプ」と対応する値でサービスを登録することにより、サービスをグループ化できるため、「タイプ」「ホットドッグ」を持つサービスと「タイプ」「ポップコーン」を持つサービスを使用できます。

    このようにすれば、OSGi Declarative Services を使用できるため、サービス登録やその他のサービス管理を行うコードを記述する必要はありません。

    于 2011-07-05T15:10:28.687 に答える