【问题标题】:OSGi feature uninstall works, but bundles are still installedOSGi 功能卸载有效,但仍安装捆绑包
【发布时间】:2011-05-31 05:41:59
【问题描述】:

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

我在运行依赖功能的背靠背“功能:卸载”命令时遇到问题。 OSGi 以“State change in progress...”作为响应,但是通过接受其他请求,我们遇到了问题。

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

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

这里是详细信息...

karaf@root> features:uninstall PolicyUtil  
karaf@root> features:uninstall Policy1  
karaf@root> features:uninstall Policy2    
State change in progress for bundle "file:/policy2.jar" by thread "Refresh Packages".  
karaf@root> features:uninstall Policy3  
State change in progress for bundle "file:/policy3.jar" by thread "Refresh Packages".  
karaf@root> features:uninstall Policy4  
karaf@root> features:uninstall Enabler1    
State change in progress for bundle "file:/enabler1.jar" by thread "Refresh Packages".    
karaf@root> features:uninstall Enabler2  
State change in progress for bundle "file:/enabler2.jar" by thread "Refresh Packages".  

afterwards...we end up with features uninstalled (correct), but some bundles still installed (incorrect)

osgi:list

[ 277] [Installed  ] [            ] [       ] [   60] Policy2  
[ 278] [Installed  ] [            ] [       ] [   60] Policy3  
[ 280] [Installed  ] [            ] [       ] [   60] Enabler1  
[ 281] [Installed  ] [            ] [       ] [   60] Enabler2  

features:list

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

【问题讨论】:

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


    【解决方案1】:

    在我的情况下,我已卸载该功能并注意到挂起的捆绑包编号,然后关闭了 karaf (3.x)。然后我删除了文件夹 [karaf-install]/data/cache/[hanging-bundle-number] 的子文件夹。 现在我重新启动 karaf 和 bundle:list 中未显示的 bundle wars。

    【讨论】:

      【解决方案2】:

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

      卡拉夫 2.2.x:

      osgi:uninstall --force yourapp-feature/0.0.1.SNAPSHOT

      【讨论】:

        【解决方案3】:

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

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

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

        选项...

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

        【讨论】:

          【解决方案4】:

          我不确定你会得到什么样的异常,但你应该注意一件事:当你使用像osgi:uninstall 这样的shell 命令卸载包时,你实际上调用了Bundle.uninstall()。正如您在 Javadoc 中看到的那样,这并不是故事的全部。

          框架倾向于对框架其余部分影响最小的操作,因此它可以卸载捆绑包删除所有相关包。如果你真的想删除所有这些,你应该使用osgi:refresh 命令。有关这方面的更多信息,请参阅Felix FAQ

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

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

          【讨论】:

          • 我查看了 osgi:refresh 并且此过程使用后台线程...我需要一个同步版本来刷新包并仅在完成时才响应...
          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-11
            • 2016-01-07
            • 1970-01-01
            相关资源
            最近更新 更多