我正在使用 Apache Karaf 4.1.1 和 Karaf Cellar。我写了两个包。第一个包提供 ITrackerManager 类型的服务。第二个包有一个引用 ITrackerManager 的组件。我的最终目标是见证第二个包中的组件成功获得对在不同节点上运行的第一个包中的 ITrackerManager 服务的引用。这都是我探索分布式 OSGi 的一部分。
当我安装第二个捆绑包时实际发生的是它已安装但由于缺少服务引用而无法激活。我一定是错误地进行了测试。关于如何展示我的最终目标的任何想法;节点 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
到目前为止,一切都很好。我在我的电脑上运行两个 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 上加载我的第二个包。这是我遇到问题的地方。我不使用 cluster:bundle-install 命令加载第二个包,因为我不希望它在节点 A 上结束。所以我使用普通的 bundle:install 命令安装我的第二个包。这会导致关于不满足参考的错误。
节点 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
就这样。我仅在 NodeB 上安装了第二个捆绑包,期望它能够成功使用仅驻留在 Node A 上的所需服务。不幸的是,这并没有发生。相反,我收到错误消息,指出有未解决的要求。它似乎表现得好像 DOSGI 不可用。如果我在同一个节点上安装两个包,则第二个包会激活而不会出现任何错误。您可能有任何见解将不胜感激。