我正在尝试使用OSGi实现客户端 - 服务器模型。服务器应用程序是在计算机中运行的OSGi框架,客户端应用程序远程连接到其控制台,并通过Java Socket发送命令并接收其正确的响应。每个客户端应用程序包含多个模块。现在我有两种方法:
1-每个模块可以是安装在框架上的捆绑包,客户端应用程序从它们接收服务。然而,这种解决方案存在问题。如果我希望每个客户端都有一个特殊的更新方法(例如,在其中一些客户端应该更新Bundle A,但在其他客户端则不应该更新),我该如何管理这种类型的更新?
2-每个客户端应用程序都是一捆捆绑包。现在我担心的是,我如何以更新客户端应用程序时更新内部包的方式管理更新操作?
答案 0 :(得分:1)
您的问题非常通用,无法在合理的时间和空间内提供详细的答案。我会尝试介绍一些想法和建议。
更新不同客户端上的不同捆绑包不是问题。从程序化的角度来看,你有很多选择(我建议你阅读OSGi in Action来浏览OSGi框架遵守规范的设施)。我不知道您是否打算使用Remote OSGI(截至Enterprise specification的第13章)。显然,您希望保留客户端 - 服务器API包/服务。除此之外,OSGi包可以从暴露它的人那里挑选一个包/服务(再次在OSGi in Action中更多)。供应是另一个方面:取决于谁(客户端或服务器)控制更新;在最简单的情况下,您只需手动处理捆绑包并从框架控制台安装/启动/停止/卸载它们。
除非我遗漏了您的描述中的内容,否则您无法选择此路径,因为您无法拥有捆绑包。这个概念在裸OSGi规范中根本就不存在。捆绑层次结构完全平坦,因此您无法执行“物理隐藏”。要改为逻辑隐藏其他捆绑包后面的捆绑包,您必须对它们公开的服务进行操作,但负担完全在您身上。您可以通过包来做同样的事情,但我不建议这样做。话虽这么说,我并不完全了解最新的服务组件架构(SCA)实施,例如Tuscany版本2.那个可以给你一臂之力承诺是OSGi意识到的。 Tuscany SCA in Action本书虽然是最近的,但仅涵盖第1版。值得一读,但可能不是你想要的。总结一下,严格来说,你不能整体地更新OSGI应用程序:你必须指定每个要更新的包。这必须被视为一个优势:您可以更好地控制您的应用程序。显而易见的缺点是以更精细的粒度管理更新。
我希望这个简化的讨论对你有用。