问题 OSGi 4.2有什么新功能?


OSGi 4.2有 刚被释放 它使用一些新的RFC来更新4.1规范。那么,OSGi 4.2有什么特别新的东西,哪个框架支持4.2已经(或接近),为什么你要针对4.2框架而不是4.1来针对新的开发?


4213
2017-09-16 18:37


起源



答案:


在大多数情况下,OSGi的一个点发布(例如4.1-> 4.2)并没有真正改变很多现有的行为,因此可以肯定地说,如果你的应用程序依赖于4.1,它将在4.2上运行而没有问题。新的是一些标准化的项目应该能够实现不同OSGi引擎之间更好的互操作性(如 春分费利克斯 和 Knopflerfish)。

事实上,尽管OSGi 4.2仅在2009年9月16日正式发布,但早期的草案已经可供其他人参考,因此之前发布的产品(如Equinox 3.5,Felix 1.8)已经对该标准有了合理的支持。与802.11n产品一样,它们符合早期的草案,但预计它们将在不久的将来被认证为完全符合4.2版本。

那么,4.2中有什么新东西?

  • 服务挂钩
  • 框架启动

并且,在纲要中

  • 远程服务
  • 捆绑追踪器
  • 蓝图服务

服务挂钩

Service Hook API允许您接收服务层发生的事件。例如,您可以在请求服务时,服务何时传递事件时挂钩,等等。您还可以导致事件未被传递(例如,隐藏您无权查看的事件)但不能更改任何事件(因为这会使正在传递的类复杂化)。服务挂钩是核心规范的一部分,因此所有OSGi版本都需要兼容。

框架启动

虽然可以以编程方式从现有Java应用程序启动OSGi实例,但执行此操作的方式取决于您正在使用的OSGi运行时。特别是,配置项(例如存储瞬态数据的位置,捆绑引导委派策略应该是什么等)都是以特定于引擎的方式定义的。这整合了任何启动实用程序在框架上设置的属性。

远程服务

远程服务API允许OGSi服务在VM之间(可能在不同的机器上)进行通信。它们如何通信的确切机制(RMI,WebServices等)对提供商是开放的,因此它与其他分布式技术(如Corba)不同,后者专门规定了有线格式。显然,分布式服务具有与本地服务不同的语义(通信错误,序列化问题),并且如果需要,可以将各个服务分配给各个服务。

捆绑追踪器

与4.1之前的ServiceTracker一样,BundleTracker可用于监视系统中哪些捆绑包的进出。动态GUI可以使用它来显示OSGi引擎的演变状态,而无需任何平台特定知识。

蓝图服务

蓝图服务类似于Spring,因为它提供了用于配置bundle的依赖注入机制。在某些方面,它类似于声明性服务;但是蓝图服务以不同的方式做事。此外,与声明性服务(只能处理存在的服务)不同,蓝图服务可以提前为服务创建代理占位符,该服务将在稍后上线。然后,对服务代理的调用将被阻塞,直到可以填充服务(而不是像声明性服务那样返回'null')。如果您对Spring IOC和类似的依赖注入感到满意或熟悉,那么Blueprint服务将立即可以理解。


12
2017-09-16 19:33



好总结。 +1 - VonC
注意:这不一定是完整列表,也不包括对现有服务的一些更改...... - AlBlue


答案:


在大多数情况下,OSGi的一个点发布(例如4.1-> 4.2)并没有真正改变很多现有的行为,因此可以肯定地说,如果你的应用程序依赖于4.1,它将在4.2上运行而没有问题。新的是一些标准化的项目应该能够实现不同OSGi引擎之间更好的互操作性(如 春分费利克斯 和 Knopflerfish)。

事实上,尽管OSGi 4.2仅在2009年9月16日正式发布,但早期的草案已经可供其他人参考,因此之前发布的产品(如Equinox 3.5,Felix 1.8)已经对该标准有了合理的支持。与802.11n产品一样,它们符合早期的草案,但预计它们将在不久的将来被认证为完全符合4.2版本。

那么,4.2中有什么新东西?

  • 服务挂钩
  • 框架启动

并且,在纲要中

  • 远程服务
  • 捆绑追踪器
  • 蓝图服务

服务挂钩

Service Hook API允许您接收服务层发生的事件。例如,您可以在请求服务时,服务何时传递事件时挂钩,等等。您还可以导致事件未被传递(例如,隐藏您无权查看的事件)但不能更改任何事件(因为这会使正在传递的类复杂化)。服务挂钩是核心规范的一部分,因此所有OSGi版本都需要兼容。

框架启动

虽然可以以编程方式从现有Java应用程序启动OSGi实例,但执行此操作的方式取决于您正在使用的OSGi运行时。特别是,配置项(例如存储瞬态数据的位置,捆绑引导委派策略应该是什么等)都是以特定于引擎的方式定义的。这整合了任何启动实用程序在框架上设置的属性。

远程服务

远程服务API允许OGSi服务在VM之间(可能在不同的机器上)进行通信。它们如何通信的确切机制(RMI,WebServices等)对提供商是开放的,因此它与其他分布式技术(如Corba)不同,后者专门规定了有线格式。显然,分布式服务具有与本地服务不同的语义(通信错误,序列化问题),并且如果需要,可以将各个服务分配给各个服务。

捆绑追踪器

与4.1之前的ServiceTracker一样,BundleTracker可用于监视系统中哪些捆绑包的进出。动态GUI可以使用它来显示OSGi引擎的演变状态,而无需任何平台特定知识。

蓝图服务

蓝图服务类似于Spring,因为它提供了用于配置bundle的依赖注入机制。在某些方面,它类似于声明性服务;但是蓝图服务以不同的方式做事。此外,与声明性服务(只能处理存在的服务)不同,蓝图服务可以提前为服务创建代理占位符,该服务将在稍后上线。然后,对服务代理的调用将被阻塞,直到可以填充服务(而不是像声明性服务那样返回'null')。如果您对Spring IOC和类似的依赖注入感到满意或熟悉,那么Blueprint服务将立即可以理解。


12
2017-09-16 19:33



好总结。 +1 - VonC
注意:这不一定是完整列表,也不包括对现有服务的一些更改...... - AlBlue


本文 详细介绍了感兴趣的RFC。去引用,

首先要注意的是   这不是一个次要的发布   版本号可能会建议。发布   4.2实际上比去年发布的R4.1更重要。在   有些观点我甚至会说   比R4发布更重要,   因为那个用法变成了   方式更容易,特别是对于没有   OSGi专家。


0
2017-09-16 18:45



我同意,尽管一些RFC(如企业的RFC)尚未完成。 - AlBlue


早期的变化是 这里突出显示

特别是,RFC 119 - 分布式OSGi功能很有趣:

该解决方案为分布式OSGi处理定义了最低级别的特性/功能,包括服务发现和对外部环境的访问。

结合 EventAdmin (在41中引入)将允许更容易地实现基于OSGi的分布式服务(目前已实现 与ECF


0
2017-09-16 18:50



是的,远程服务(现在称为分布式OSGi)很有趣。有一个很好的写作 wiki.eclipse.org/... 关于如何将ECF的远程服务普遍用于您自己的任何一个 - - AlBlue


当引用绑定不可用时,声明性服务实际上是否返回null?在Equinox上,即使我将模式设置为动态模式,如果无法“连线”,我的组件也不会被实例化。如你所说,我宁愿把它设置为“null”,这样我就可以有可选的引用绑定并使用动态发现......

此外,我错过了在绑定服务时轻松找到组件属性的可能性(我必须转到Bundle上下文,获取服务引用,迭代和比较 - 不实用)。也许我错过了一些东西。


0
2017-09-17 08:34



您可以在声明规范中设置cardinality =“0..1”或“0..n”,在这种情况下,它是可选的,因此即使从属服务不可用,也可以启动组件。 - AlBlue
哦,谢谢,这很明显我错过了! :)