OSGi:如何知道捆绑包是否已更新

时间:2014-04-23 11:58:49

标签: java maven osgi updates apache-ace

在OSGi(Apache Felix 4.2.1)中,我希望我的软件包在启动时自动检查更新。

我使用以下代码执行此操作(在我的“管理代理”中)。如何判断捆绑包是否已更新?

Bundle[] bundles = context.getBundles();
for (int i = 0; i < bundles.length; i++) {
  Bundle bundle = bundles[i];
  bundle.update();
}
// which bundle was updated?

我想自动刷新捆绑包(使用FrameworkWiring),但前提是其中一个.update()调用实际上导致了我的服务器的新部署。

当我从Maven部署到我的OBR时,我的SNAPSHOT版本具有相同的编号。从gogo,我可以看到Bnd-LastModified标题发生变化,但如何自动化?

PS:如果存在简单的解决方案来解决整个更新事情比滚动我自己更好,我也很感兴趣。它需要精益。 (Apache Karaf?,Apache ACE?其他人?)

3 个答案:

答案 0 :(得分:3)

它们都已更新,因为您的代码清楚地在所有代码上调用了update

您可能的意思是如何判断捆绑是否需要进行更新。为此,您可以使用bundle.getLastModified()方法,并将其与文件的时间戳进行比较。但是,当您有多台计算机生成的时间戳时,这会带来风险,因为它们的系统时钟永远不会精确同步。如果它们来自远程服务器(例如通过HTTP),那么就忘了它。下载后你应该使用类似ETag或SHA散列的文件。

答案 1 :(得分:2)

如果您想了解更多关于Apache ACE的信息,我建议您阅读ACE网站上的以下两篇文章:

老实说,如果你想要的只是在启动时更新一组软件包,那么ACE就有点矫枉过正了。它可用于管理多个&#34;目标&#34; (来自OSGi的框架)来自中央服务器,自动推送更新到它并管理大量的捆绑和其他工件,将它们分组在功能和发行版中。

答案 2 :(得分:0)

您是否尝试过实施listener