在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
标头发生了变化,但如何自动化呢?
附言:如果有简单的解决方案可以比我自己的解决方案更好地解决整个更新问题,我也很感兴趣。它需要精简。(Apache Karaf?、Apache ACE?其他?)
它们都已更新,因为您的代码清楚地在所有它们上调用update
。
您的意思可能是如何判断捆绑包是否需要更新。为此,您可以使用bundle.getLastModified()
方法,并将其与文件的时间戳进行比较。但当你有多台计算机生成的时间戳时,这会有风险,因为它们的系统时钟永远不会精确同步。如果它们来自远程服务器(例如通过HTTP),那么就忘了它。下载后,你可能应该使用类似ETag或SHA哈希的文件。
如果你想了解更多关于Apache ACE的信息,我建议你阅读ACE网站上的以下两篇文章:
- http://ace.apache.org/user-doc/getting-started.html
- http://ace.apache.org/user-doc/user-guide.html
老实说,如果您只想在启动时更新一组捆绑包,那么ACE就有点过头了。它可以用于从中央服务器管理多个"目标"(运行OSGi的框架),自动向其推送更新,并管理大型捆绑包和其他工件集,将它们分组为特性和分布。
您尝试过实现监听器吗?