OSGi功能卸载工作,但仍然安装了捆绑包

时间:2010-12-27 17:13:46

标签: osgi apache-karaf apache-felix apache-servicemix fuse

编辑:用最新信息更新了这个问题...

我遇到了背靠背“功能:卸载”依赖功能命令的问题。 OSGi回应“状态正在改变......”,但通过接受其他请求,我们遇到了问题。

奇怪的是,这会导致功能卸载成功,但捆绑卸载失败。我们通过尝试适当地订购卸载请求并在步骤之间添加延迟来解决这个问题,但我希望能够提供更强大的解决方案。

正如所建议的那样,我也尝试在步骤之间添加“osgi:refresh”......同样的行为。是否有另一种方法可以检测“刷新包”是否仍在运行以延迟后续请求等?

以下是详细信息......

karaf @根>功能:卸载PolicyUtil
karaf @根>功能:卸载Policy1
karaf @根>功能:卸载Policy2
通过线程“刷新包”更新捆绑“file:/policy2.jar”的进度 karaf @根>功能:卸载Policy3
通过线程“刷新包”状态更改捆绑“file:/policy3.jar”的进度 karaf @根>功能:卸载Policy4
karaf @根>功能:卸载Enabler1
通过线程“刷新包”更新捆绑“file:/enabler1.jar”的进度 karaf @根>功能:卸载Enabler2
通过线程“刷新包”修改bundle“file:/enabler2.jar”的进度状态。

之后......我们最终安装了已卸载的功能(正确),但仍安装了一些捆绑包(不正确)

的OSGi:列表

[277] [已安装] [] [] [60]政策2
[278] [已安装] [] [] [60]政策3
[280] [已安装] [] [] [60]启动器1 [281] [已安装] [] [] [60]启用2

特点:列表

[uninstalled] [1.0] PolicyUtil repo-0
[卸载] [1.0] Policy1 repo-0
[已卸载] [1.0] Policy2 repo-0
[卸载] [1.0] Policy3 repo-0
[uninstalled] [1.0] Enabler1 repo-0
[uninstalled] [1.0] Enabler2 repo-0

5 个答案:

答案 0 :(得分:5)

我不确定你会得到什么样的异常,但你应该知道一件事:当你使用像osgi:uninstall这样的shell命令卸载一个包时,你实际上会调用Bundle.uninstall()。你可以在那里阅读Javadoc,这不是整个故事。

该框架支持对框架其余部分影响最小的操作,因此它可以卸载包而无需删除所有相关包。如果您确实要删除所有这些,则应使用osgi:refresh命令。有关详细信息,请参阅Felix FAQ

我能给出的最好建议是不发出可以互相交叉的多个uninstall请求。如果您要删除一组捆绑包,我会触发非交叉uninstall()请求,然后是一个refreshPackages()。此外,我不会在单个系统中使用“常规”控制台和Karaf混合捆绑管理。

您还可以考虑使用外部管理器来安装和删除捆绑包。如果你想要远程管理,你可以去Apache ACE(披露:我是Apache ACE提交者)。

答案 1 :(得分:2)

Oor ...您可以使用以下命令简单地卸载您的应用程序:

karaf 2.2.x:

osgi:卸载--force yourapp-feature / 0.0.1.SNAPSHOT

答案 2 :(得分:1)

好吧,我一直在深入研究这个问题,我想我理解这个问题和选项......感谢您的回复。

当执行“features:uninstall [name]”时,它会调用bundle.uninstall(),然后为功能中的每个bundle调用refreshPackages()。然后,在卸载所有bundle之后,它会为所有bundle调用refreshPackages()。问题是refreshPackages()是异步的(根据OSGi spec)并使bundle处于解析状态。卸载解析功能/捆绑包的后续请求无法按预期完成。

如果卸载之间有足够的延迟,或者执行了稍后的卸载(在refreshPackages()完成之后)......一切都按预期工作。

选项...

  1. 卸载期间依赖于订单的功能/捆绑(难以控制)
  2. 在卸载命令之间延迟(不完全)
  3. 验证预期功能/捆绑包已卸载(或继续等待)
  4. 侦听FrameworkEvent.PACKAGES_REFRESHED事件(复杂且无法保证,因为事件是容器范围的,请参阅this example
  5. 修改Karaf / Felix以支持同步刷新包的选项(请参阅this issue/resolution了解Karaf 2.1.3)

答案 3 :(得分:0)

根据我的经验,当另一个bundle仍然引用或使用bundle的资源时会发生这种情况。在这种情况下,框架无法删除捆绑包,整个jar文件仍由VM处理。

查看并确保删除所有引用。一个常见错误仍然是在bundle中实例化的一个对象中运行线程。这也算作仍在使用的资源广告,无法删除。

答案 4 :(得分:0)

在我的情况下,我已经卸载了该功能,并注意到挂包数,然后关闭karaf(3.x)。然后我删除了文件夹[karaf-install] / data / cache / [hanging-bundle-number]的子文件夹。 现在我重新启动karaf并且捆绑战争没有显示在捆绑包中:列表。

相关问题