私は 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 番目のバンドルがエラーなしでアクティブになります。あなたが持っているかもしれない洞察をいただければ幸いです。