【问题标题】:How to clean OSGi bundles cache at runtime如何在运行时清理 OSGi 包缓存
【发布时间】:2015-12-12 14:32:20
【问题描述】:

我有以下示例场景...(请注意,我可以使用服务来实现该场景,但我正在尝试一些事情)

一个带有 Activator 类(命名为“客户端”)的 OSGi 包和另一个作为简单库(命名为“服务器”)的 OSGi 包,公开了一个名为 callMe() 的方法。在“客户端”的 start() 方法中,调用了“服务器”的 callMe() 方法。当然,“服务器”包暴露了我们拥有带有 callMe() 方法的类的包,而“客户端”包将其作为导入包。 在没有安装两个包的情况下启动 OSGi 框架,我首先安装“客户端”包,当我尝试执行 start() 方法时,显示以下错误:

org.osgi.framework.BundleException:捆绑包org.example.helloworld [4]中未解决的约束:无法解决4.0:缺少要求[4.0] osgi.wiring.package; (osgi.wiring.package=org.example.helloworldlib)

这是正确的,因为“服务器”包既没有安装也没有解析。 现在,我安装“服务器”包并在“客户端”上调用 start():这一次一切正常,因为安装了“服务器”包,因此可以解析、激活“客户端”并且它可以调用 callMe() 方法“服务器”。

之后,我卸载了“服务器”捆绑包,留下了“客户端”。奇怪的是现在......停止“客户端”并重新启动()它......“客户端”工作!即使我之前卸载它也可以调用“服务器”的 callMe() 方法!我知道 OSGi 框架有一个包缓存,所以似乎“服务器”包在缓存中,但为什么它没有显示在包列表中?

是否可以在运行时清理缓存?

保罗。

【问题讨论】:

  • 我刚刚看到,使用“刷新”命令,我们可以强制 OSGi 框架重新检查捆绑包及其“已解决”状态。如果我调用“刷新”,我认为“客户端”包从“活动”变为“安装”状态,因为“服务器”包现在丢失了。如果我现在为“客户端”调用 start 它会失败,因为“服务器”不再存在。现在好像不在缓存中了……对吗?

标签: java osgi osgi-bundle


【解决方案1】:

当捆绑包进入已解决状态时,OSGi 会构建与所需包的连接。然后它会保留这些连线,直到调用刷新。

因此,当您卸载服务器捆绑包时,客户端继续工作是完全正常的。

当您调用 refresh 时,解析步骤会再次完成。所以此时客户端无法解析。据我所知,接线没有缓存在磁盘上。

因此,如果您卸载服务器并重新启动框架客户端也应该无法解析。

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2016-12-10
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多