1.4. OSGi 服务

1.4.1. 概述

OSGi 服务是 Java 类或服务接口,其服务属性定义为名称/值对。服务属性区分通过同一服务接口提供服务的服务供应商。

OSGi 服务由服务界面定义,它作为服务对象实施。服务的功能由它实施的接口定义。因此,不同的应用程序可以实施相同的服务。

服务接口允许捆绑包通过绑定接口而不是实现来交互。服务接口应尽可能使用几个实施详情来指定。

1.4.2. OSGi 服务 registry

在 OSGi 框架中,服务层使用发布、查找和绑定服务模型提供 第 1.5 节 “OSGi 捆绑包” 及其包含组件之间的通信。该服务层包含一个服务 registry,其中:

  • 服务供应商将服务注册到框架,供其他捆绑包使用
  • 服务请求者查找服务并绑定到服务提供商

服务归捆绑包所有,并在其内运行。捆绑包在一个或多个 Java 接口下将服务的实施注册到框架服务 registry。因此,服务的功能可供框架控制下的其他捆绑包使用,其他捆绑包可以查找和使用该服务。lookup 使用 Java 接口和服务属性来执行。

每个捆绑包都可以使用其接口及其属性的完全限定名称在服务 registry 中注册多个服务。捆绑包使用带有 LDAP 语法的名称和属性来查询服务 registry。

捆绑包负责运行时服务依赖项管理活动,包括发布、发现和绑定。捆绑包也可以适应绑定捆绑包的服务的动态可用性(arrival 或 departure)生成的更改。

事件通知

服务接口由捆绑包创建的对象实施。捆绑包可以:

  • 注册服务
  • 搜索服务
  • 当注册状态发生变化时接收通知

OSGi 框架提供了一个事件通知机制,因此服务请求者可以在发生服务 registry 中的更改时接收通知事件。这些更改包括发布或检索特定服务以及注册、修改或取消注册服务的时间。

服务调用模型

当捆绑包希望使用服务时,它会查找服务,并将 Java 对象作为普通的 Java 调用调用。因此,服务的调用是同步的,并在同一线程中发生。您可以使用回调进行更多异步处理。参数作为 Java 对象引用传递。XML 不需要 marshalling 或 Intermediary 规范格式。OSGi 为服务不可用问题提供了解决方案。

JAAS 框架服务

除了您自己的服务外,OSGi 框架还提供以下可选服务来管理框架的操作:

  • Package Admin service- 允许管理代理通过检查共享软件包的状态来定义管理 Java 软件包共享的策略。它还允许管理代理刷新软件包,并根据需要停止和重启捆绑包。此服务可让管理代理在卸载或更新导出捆绑包时就任何共享软件包做出决策。

    该服务还提供刷新自上次刷新后删除或更新的软件包的方法,以及显式解析特定捆绑包。此服务也可以在运行时跟踪捆绑包之间的依赖关系,允许您查看升级可能会影响哪些捆绑包。

  • 启动级别服务- 启用管理代理来控制捆绑包的启动和停止顺序。该服务为每个捆绑包分配一个起始级别。管理代理可以修改捆绑包的起始级别,并设置框架的活动启动级别,以启动和停止适当的捆绑包。只有启动级别小于或等于的捆绑包,这个活跃启动级别可以处于活跃状态。
  • URL Handlers 服务- 动态将 Java 运行时扩展为 URL 方案和内容处理程序,使任何组件能够提供额外的 URL 处理程序。
  • 权限管理服务- 启用 OSGi 框架管理代理,以管理特定捆绑包的权限,并为所有捆绑包提供默认值。捆绑包可以有一组权限,用于验证它是否被授权执行特权代码。您可以通过实时更改策略并为新安装的组件添加新策略来动态操作权限。策略文件用于控制捆绑包可以执行的操作。
  • 条件 Permission Admin service- 在检查权限时,扩展具有可在特定条件为 true 或 false 的 Permission Admin 服务的权限。这些条件决定了权限应用到的捆绑包的选择。权限在设置后立即激活。

OSGi 框架服务在 OSGi 联盟网站上 发行 4 发布后的 4 版本 4 规范的 单独章节中详细介绍。

OSGi Compendium 服务

除了 OSGi 框架服务外,OSGi 联盟还定义了一组可选的、标准化的编译型服务。OSGi compendium 服务为日志记录和首选项等任务提供 API。这些服务在 OSGi 联盟 Web 站点上的 版本 4 下载页面 提供的 OSGi Service Platform (服务编译)中进行了描述。

Configuration Admin compendium 服务类似于一个中央 hub,它会保留配置信息并将其分发到感兴趣的方。Configuration Admin 服务指定部署的捆绑包的配置信息,并确保捆绑包在激活时接收这些数据。捆绑包的配置数据是一个名称值对列表。请参阅 第 1.2 节 “Apache Karaf 架构”