我有几个OSGi包,每个包都可以从OSGi Bundle Repository更新。 当我启动我的OSGi框架(Apache Felix)时,我希望第一个包启动并检查所有已安装捆绑包的更新。如果有可用的更新,则应更新每个更新(包括其自身),然后继续启动(或可能关闭,操作系统将重新启动应用程序)。
如何以符合OSGi的方式做到最好?
第一个捆绑包应该如何更新?它可以在启动时自行更新吗?
答案 0 :(得分:4)
你应该做几件事:
确保您有一个捆绑(规范中经常调用的“管理代理”),首先在框架(重新)启动时启动,它的启动级别低于所有其他捆绑包。还要确保告诉系统以等于管理代理程序的启动级别开始。这样,该捆绑包就可以在实际开始之前更新框架中的所有其他捆绑包。只有在管理代理完成更新后,它才会刷新所有软件包并转到下一个启动级别,有效启动所有其他软件包。
要更新管理代理,最好的方法是临时安装实际执行更新的第二个捆绑包。管理代理中的产生线程不是最佳解决方案,因为一旦捆绑停止并且不遵守这些线程,这些线程不应继续运行,这可能会给您带来难以解决的问题。如果更新失败,第二个包实际上会更新,甚至可能会回滚。
可以在Apache ACE中找到可以自行更新的管理代理示例。它有一个代理,它将从代码安装第二个包以从远程位置更新自己。指向该项目相关部分的一些指示:
答案 1 :(得分:2)
您可以查看OSGi核心规范中的状态图(这应该是图28)。在那里,您可以看到处于STARTING状态的bundle只能移动到ACTIVE状态(抛出异常时除外)。只有在处于INSTALLED或RESOLVED状态时才能更新bundle。为此,必须在它处于ACTIVE状态时停止。
这里的问题是当它处于STARTING状态时你无法阻止它。只要执行Activators start()方法,bundle就仍然处于STARTING状态,而不是ACTIVE。
您可以做的是在Bundle中启动一个线程,检查其状态是否为ACTIVE,然后调用update()方法。但是不要忘记终止线程,否则垃圾收集器无法释放当前bundle的jar文件的资源。