0

私は Apache Karaf 4.1.1 と Karaf Cellar を使用しています。私は2つのバンドルを書きました。最初のバンドルは、タイプ ITrackerManager のサービスを提供します。2 番目のバンドルには、ITrackerManager を参照するコンポーネントがあります。私の最終的な目標は、2 番目のバンドルのコンポーネントが、別のノードで実行されている最初のバンドルの ITrackerManager サービスへの参照を正常に取得することを確認することです。これはすべて、分散 OSGi に関する私の探求の一部です。

その 2 番目のバンドルをインストールしたときに実際に起こっていることは、インストールされたものの、サービス参照がないためにアクティブ化に失敗したことです。テストを間違って実施しているに違いありません。最終目標をどのように実証するかについてのアイデア。ノード B のバンドルのコンポーネントは、ノード A のサービスを正常に使用しますか?


これまでにテストを実行した方法は次のとおりです。

ノード A

karaf@root()> cluster:node-list
  | Id                | Alias | Host Name    | Port
--+-------------------+-------+--------------+-----
x | 159.4.251.58:5701 |       | 159.4.251.58 | 5701
  | 159.4.251.58:5702 |       | 159.4.251.58 | 5702

ノード B

karaf@root()> cluster:node-list
  | Id                | Alias | Host Name    | Port
--+-------------------+-------+--------------+-----
  | 159.4.251.58:5701 |       | 159.4.251.58 | 5701
x | 159.4.251.58:5702 |       | 159.4.251.58 | 5702

ここまでは順調ですね。コンピューターで 2 つの karaf インスタンスを実行しています。両方のインスタンスがお互いを認識します。ここで、その最初のバンドルをノード A のみにインストールしたいと考えています。これを実現するために、バンドルをクラスターにインストールし、特にノード B から削除します。

ノード A

karaf@root()> cluster:bundle-install -s default mvn:myCompany/dosgi-example-part1/1.0-SNAPSHOT

karaf@root()> cluster:bundle-list default
Bundles in cluster group default
ID | State    | Lvl | Located       | Blocked | Version        | Name
---+----------+-----+---------------+---------+----------------+--------------------------------------------------------------
 0 | Active   |     | cluster/local |         | 5.6.2          | System Bundle
...
67 | Active   |     | cluster/local       |         | 1.0.0.SNAPSHOT | Distributed OSGi Example Part 1

karaf@root()> cluster:service-list
Service Class             | Provider Node
--------------------------+------------------
myCompany.ITrackerManager | 159.4.251.58:5701
                          | 159.4.251.58:5702

まだまだ元気そうです。バンドルはクラスター内にあり、ノード A (およびこの時点ではノード B) でローカルにあり、サービスはクラスターによって認識され、ノード A とノード B の両方で使用できます。次に、ノード B からバンドルを削除します。

ノード B

karaf@root()> cluster:bundle-list default
Bundles in cluster group default
ID | State    | Lvl | Located       | Blocked | Version        | Name
---+----------+-----+---------------+---------+----------------+-------------------------------------------------------------
67 | Active   |     | cluster/local |         | 1.0.0.SNAPSHOT | Distributed OSGi Example Part 1

karaf@root()> bundle:list
START LEVEL 100 , List Threshold: 50
ID | State  | Lvl | Version        | Name
---+--------+-----+----------------+-----------------------------------------------
75 | Active |  80 | 1.0.0.SNAPSHOT | Distributed OSGi Example Part 1

karaf@root()> bundle:uninstall 75

karaf@root()> cluster:bundle-list default
Bundles in cluster group default
ID | State    | Lvl | Located       | Blocked | Version        | Name
---+----------+-----+---------------+---------+----------------+--------------------------------------------------------------
67 | Active   |     | cluster |         | 1.0.0.SNAPSHOT | Distributed OSGi Example Part 1

karaf@root()> cluster:service-list
Service Class             | Provider Node
--------------------------+------------------
myCompany.ITrackerManager | 159.4.251.58:5701

優秀な。最初のバンドルはノード B から削除されていますが、まだクラスター内にあると表示されています。両方のノードは、私のサービスが現在ノード A でのみ利用可能であることに同意しています (バンドルがノード B から削除されたため)。ここで、ノード B のみに 2 番目のバンドルをロードします。ここで問題が発生します。cluster:bundle-install コマンドを使用して 2 番目のバンドルをロードしません。ノード A で終了させたくないためです。代わりに、通常の bundle:install コマンドを使用して 2 番目のバンドルをインストールします。これにより、満たされていない参照に関するエラーが発生します。

ノード B

karaf@root()> bundle:install -s mvn:otherCompany/dosgi-example-part2/1.0-SNAPSHOT
Bundle ID: 76
Error executing command: Error installing bundles:
        Unable to start bundle mvn:otherCompany/dosgi-example-part2/1.0-SNAPSHOT: org.osgi.framework.BundleException: Unable to resolve otherCompany.dosgi-example-part2 [76](R 76.0): missing requirement [otherCompany.dosgi-example-part2 [76](R 76.0)] osgi.wiring.package; (&(osgi.wiring.package=myCompany)(version>=1.0.0)(!(version>=2.0.0))) Unresolved requirements: [[otherCompany.dosgi-example-part2 [76](R 76.0)] osgi.wiring.package; (&(osgi.wiring.package=myCompany)(version>=1.0.0)(!(version>=2.0.0)))]

karaf@root()> bundle:list
START LEVEL 100 , List Threshold: 50
ID | State     | Lvl | Version        | Name
---+-----------+-----+----------------+-----------------------------------------------------------------------------------------------------
76 | Installed |  80 | 1.0.0.SNAPSHOT | Distributed OSGi Example Part 2

それで、それはあります。ノード A にのみ存在する必要なサービスを正常に使用できることを期待して、ノード B にのみ 2 番目のバンドルをインストールします。残念ながら、それは起こりません。代わりに、未解決の要件があることを示すエラー メッセージが表示されます。DOSGI が利用できないかのように動作するようです。両方のバンドルを同じノードにインストールすると、2 番目のバンドルがエラーなしでアクティブになります。あなたが持っているかもしれない洞察をいただければ幸いです。

4

1 に答える 1