0

在 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?其他?)

4

3 回答 3

3

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

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

于 2014-04-23T13:13:17.573 回答
2

如果你想进一步了解 Apache ACE,我可以推荐阅读 ACE 网站上的以下两篇文章:

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

于 2014-04-23T21:27:33.207 回答
0

您是否尝试过实现监听器?

于 2014-04-23T12:02:35.390 回答