我有几个OSGi包,每个包都可以从OSGi Bundle Repository更新.当我启动我的OSGi框架(Apache Felix)时,我希望第一个包启动并检查所有已安装捆绑包的更新.如果有可用的更新,则应更新每个更新(包括其自身),然后继续启动(或可能关闭,操作系统将重新启动应用程序).
如何以符合OSGi的方式完成这项工作?
第一个捆绑包应该如何更新?它可以在启动时更新吗?
您应该做几件事:
确保您有一个捆绑包(规范中通常称为“管理代理”)首先在框架(重新)启动时启动,方法是为其提供比所有其他捆绑包更低的启动级别。还要确保告诉系统以与管理代理相同的启动级别启动。这样,该捆绑包将能够在框架中的所有其他捆绑包实际开始之前更新它们。只有在管理代理完成更新后,它才会刷新所有包并进入下一个启动级别,从而有效地启动所有其他包。
要更新管理代理,最好的方法是临时安装实际执行更新的第二个捆绑包。在管理代理中生成线程并不是最好的解决方案,因为一旦捆绑包停止,这些线程就不应该继续运行,不遵守这一规定可能会给您带来难以解决的问题。第二个捆绑包实际上会更新,如果更新失败甚至可能会回滚。
可以在 Apache ACE 中找到可以自我更新的管理代理示例。它有一个代理,可以通过代码安装第二个包,以从远程位置更新自身。该项目相关部分的一些提示: