第 12 章 OSGi 服务
摘要
OSGi 核心框架定义了 OSGi 服务层,它通过将 Java 对象注册为 OSGi 服务注册表中的 服务来交互,为捆绑提供简单机制。OSGi 服务模型的一大优势 是任何 Java 对象都可以作为服务提供:没有必须应用到服务类的特定约束、继承规则或注解。本章论述了如何使用 OSGi Blueprint 容器部署 OSGi 服务。
12.1. Blueprint 容器
摘要
Blueprint 容器是一种依赖项注入框架,简化了与 OSGi 容器的交互。Blueprint 容器支持使用 OSGi 服务 registry 进行基于配置的方法,例如,提供用于导入和导出 OSGi 服务的标准 XML 元素。
12.1.1. 蓝图配置
JAR 文件中蓝图文件的位置
与捆绑包 JAR 文件的根目录相比,Blueprint 配置文件的标准位置是以下目录:
OSGI-INF/blueprint
在此目录中带有后缀 .xml
的任何文件都解释为 Blueprint 配置文件;换句话说,任何与模式匹配的文件,OSGI -INF/blueprintAttr.xml
。
Maven 项目中的蓝图文件的位置
在 Maven 项目( ProjectDir )的上下文中,Blueprint 配置文件的标准位置是以下目录:
ProjectDir/src/main/resources/OSGI-INF/blueprint
蓝图命名空间和 root 元素
蓝图配置元素与以下 XML 命名空间关联:
http://www.osgi.org/xmlns/blueprint/v1.0.0
Blueprint 配置的根元素是 蓝图
XML 配置文件,因此蓝图 XML 配置文件通常具有以下概述形式:
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> ... </blueprint>
在蓝图
root 元素中,不需要使用 xsi:schemaLocation
属性指定 Blueprint 模式的位置,因为 schema 位置已经对 Blueprint 框架知道。
蓝图清单配置
Blueprint 配置的一些方面由 JAR 清单文件中的标头控制,META-INF/MANIFEST.MF
,如下所示:
自定义蓝图文件位置
如果您需要将蓝图配置文件放在非标准位置(即 OSGI-INF/blueprintAttr.xml
以外的其他位置),您可以在清单文件的 Bundle-Blueprint
标头中指定以逗号分隔的替代位置列表,例如:
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml
必需的依赖项
默认情况下,对 OSGi 服务的依赖项是强制的(虽然可以通过在 reference 项或
元素上将 reference
-listavailability
属性设置为 optional
来更改此设置)。要声明依赖项是强制的,意味着捆绑包在没有依赖项的情况下无法正常工作,并且依赖项必须始终可用。
通常,在蓝图容器初始化时,它会通过 宽限期,这时尝试解析所有强制依赖项。如果此时无法解决强制依赖项(默认超时为 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
标头的值是分号分隔的列表,其中第一个项是实际捆绑包符号名称,第二个项是 blueprint.graceperiod:=true
,启用宽限期和第三个项目 blueprint.timeout:= 10000
,指定 10 秒超时。
12.1.2. 定义服务 Bean
概述
Blueprint 容器允许您使用 bean
元素实例化 Java 类。您可以以这种方式创建所有主应用程序对象。特别是,您可以使用 bean
元素来创建代表 OSGi 服务实例的 Java 对象。
蓝图 bean 元素
Blueprint bean
元素在 Blueprint schema 命名空间 http://www.osgi.org/xmlns/blueprint/v1.0.0
中定义。
Bean 示例
以下示例演示了如何使用 Blueprint 的 bean 元素创建几个不同类型的 bean
:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="label" class="java.lang.String"> <argument value="LABEL_VALUE"/> </bean> <bean id="myList" class="java.util.ArrayList"> <argument type="int" value="10"/> </bean> <bean id="account" class="org.fusesource.example.Account"> <property name="accountName" value="john.doe"/> <property name="balance" value="10000"/> </bean> </blueprint>
其中,最后一个 bean 示例引用的 Account
类可以定义如下:
package org.fusesource.example; public class Account { private String accountName; private int balance; public Account () { } public void setAccountName(String name) { this.accountName = name; } public void setBalance(int bal) { this.balance = bal; } ... }
参考
有关定义 Blueprint Bean 的详情,请查看以下引用:
- Spring Dynamic Modules Reference Guide v2.0, Blueprint 章节.
- 第 121 节 蓝图容器规范,来自 OSGi Compendium 服务 R4.2 规范。
12.1.3. 使用属性配置蓝图
概述
这部分描述了如何使用在 Camel 上下文之外的文件中保留的属性配置 Blueprint。
配置蓝图 Bean
蓝图 Bean 可使用可以从外部文件属性从属的变量进行配置。您需要声明 ext
命名空间,并在 Blueprint xml 中添加 属性占位符
bean。使用 Property-Placeholder
bean 将属性文件的位置声明给 Blueprint。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"> <ext:property-placeholder> <ext:location>file:etc/ldap.properties</ext:location> </ext:property-placeholder> ... <bean ...> <property name="myProperty" value="${myProperty}" /> </bean> </blueprint>
属性拥有者配置选项
的规格可在 http://aries.apache.org/schemas/blueprint-ext/blueprint-ext.xsd 中找到。