第 12 章 OSGi 服务
摘要
OSGi 核心框架定义了 OSGi 服务层,它提供了一个简单机制,通过将 Java 对象注册为 OSGi 服务 registry 中的服务来进行交互。OSGi 服务模型的优势在于,任何 Java 对象都可以作为服务来提供:没有特定限制、继承规则或注解必须应用于服务类。本章论述了如何使用 OSGi Blueprint 容器部署 OSGi 服务。
12.1. Blueprint 容器 复制链接链接已复制到粘贴板!
摘要
Blueprint 容器是一个依赖项注入框架,简化了与 OSGi 容器的交互。Blueprint 容器支持使用基于配置的方法,使用 OSGi 服务注册表(例如,提供标准的 XML 元素用于导入和导出 OSGi 服务)。
12.1.1. 蓝图配置 复制链接链接已复制到粘贴板!
在 JAR 文件中的蓝图文件位置
相对于 bundle JAR 文件的根目录,Blueprint 配置文件的标准位置如下:
OSGI-INF/blueprint
OSGI-INF/blueprint
						此目录下带有后缀 .xml 的文件解释为 Blueprint 配置文件;换句话说,任何与模式匹配的文件 OSGI-INF/blueprint/*.xml。
					
Maven 项目中的蓝图文件位置
在 Maven 项目 ProjectDir 上下文中,Blueprint 配置文件的标准位置如下:
ProjectDir/src/main/resources/OSGI-INF/blueprint
ProjectDir/src/main/resources/OSGI-INF/blueprint
蓝图命名空间和 root 元素
蓝图配置元素与以下 XML 命名空间关联:
http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0
						蓝图配置的根元素是 蓝图,因此蓝图 XML 配置文件通常具有以下概述:
					
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> ... </blueprint>
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
  ...
</blueprint>
							在 蓝图 根元素中,不需要使用 xsi:schemaLocation 属性指定 Blueprint 模式的位置,因为 schema 位置已已知在 Blueprint 框架中。
						
蓝图清单配置
							Blueprint 配置的一些方面由 JAR 清单文件中 META-INF/MANIFEST.MF 中的标头控制,如下所示:
						
自定义蓝图文件位置
							如果您需要将 Blueprint 配置文件放在非标准位置(即 OSGI-INF/blueprint/*.xml以外的其他位置),您可以用逗号分隔在清单文件中 Bundle-Blueprint 标头中的其他位置列表:
						
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml
必需的依赖项
							默认情况下,OSOS 服务的依赖项是强制的(虽然通过将 availability 属性设置为参考元素或一个 参考 列表 元素上的 可选 )可以进行更改。将依赖项声明为强制性意味着捆绑包无法正常运行,且这个依赖关系必须始终可用。
						
						通常,当蓝图容器被初始化时,它会通过 宽限期,在这期间它尝试解析所有强制的依赖项时。如果在此时间内无法解决强制依赖关系(默认超时为 5 分钟),则容器初始化将中止且不会启动捆绑包。以下设置可附加到 Bundle-SymbolicName 清单标头中,以配置宽限期:
					
blueprint.graceperiod- 
									如果为 
true(默认),则启用了宽限期,并且 Blueprint 容器在初始化过程中会等待一个强制依赖项解析;如果为false,则会跳过宽限期,容器不会检查是否已解决强制依赖关系。 blueprint.timeout- 以毫秒为单位指定宽限期超时。默认值为 300000(5 分钟)。
 
						例如,要启用 10 秒的宽限期,您可以在清单文件中定义以下 Bundle-SymbolicName 标头:
					
Bundle-SymbolicName: org.fusesource.example.osgi-client; blueprint.graceperiod:=true; blueprint.timeout:= 10000
Bundle-SymbolicName: org.fusesource.example.osgi-client;
 blueprint.graceperiod:=true;
 blueprint.timeout:= 10000
						Bundle-SymbolicName 标头的值是一个分号隔开的列表,其中第一个项目是实际捆绑包符号名称,第二个项目是 蓝图。graceperiod:=true 来启用宽限期,第三项,blueprint.timeout:= 10000 指定了 10 秒超时。
					
12.1.2. 定义服务 Bean 复制链接链接已复制到粘贴板!
概述
							Blueprint 容器允许您使用 bean 元素实例化 Java 类。您可以以这种方式创建所有主应用程序对象。特别是,您可以使用 bean 元素创建代表 OSGi 服务实例的 Java 对象。
						
蓝图 Bean 元素
							Blueprint bean 元素在 Blueprint 架构命名空间 http://www.osgi.org/xmlns/blueprint/v1.0.0 中定义。
						
Bean 示例
							以下示例演示了如何使用 Blueprint 的 Bean 来创建几种不同类型的 bean :
						
						其中 ,最后一个 bean 示例引用的帐户 类可以定义如下:
					
参考信息
有关定义 Blueprint Bean 的详情,请参考以下参考:
- Spring 动态模块参考指南 v2.0, Blueprint 章节.
 - 第 121 蓝图容器规范,来自 OSGi Compendium Services R4.2 规范。
 
12.1.3. 使用属性配置蓝图 复制链接链接已复制到粘贴板!
概述
这部分论述了如何使用在 Camel 上下文以外的文件中保存的属性配置 Blueprint。
配置 Blueprint Bean
							蓝图 Bean 可以通过使用可通过从外部文件使用属性放置的变量进行配置。您需要声明 ext 命名空间,并在 Blueprint xml 中添加 属性占位符 an。使用 Property-Placeholder bean 声明您的属性文件的位置到 Blueprint。
						
						属性拥有者配置选项 的规格可在 http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd 找到。