第 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 -list 元素上将 availability 属性设置为 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 的详情,请查看以下引用:

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 中找到。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.