12.5. 访问 OSGi 服务


12.5.1. 概述

本节介绍如何在 OSGi 容器中生成、构建和部署简单的 OSGi 客户端。客户端在 OSGi 注册表中找到简单的 Hello World 服务,并在其上调用 sayHello () 方法。

12.5.2. 先决条件

要使用 Maven Quickstart archetype 生成项目,您必须满足以下先决条件:

  • Maven 安装- Maven 是 Apache 的免费开源构建工具。您可以从 http://maven.apache.org/download.html 下载最新版本(最小为 2.0.9)。
  • 互联网连接- 执行构建,Maven 会动态搜索外部存储库,并即时下载所需的工件。为了正常工作,您的构建机器 必须 连接到互联网。

12.5.3. 生成 Maven 项目

maven-archetype-quickstart archetype 创建一个通用 Maven 项目,然后您可以针对您想要的任何目的进行自定义。要使用协调( org.fusesource.example:osgi-client )生成 Maven 项目,请输入以下命令:

mvn archetype:create
-DarchetypeArtifactId=maven-archetype-quickstart
-DgroupId=org.fusesource.example
-DartifactId=osgi-client

此命令的结果是一个目录 ProjectDir/osgi-client,包含所生成的项目的文件。

注意

请注意 ,不要为您的工件选择一个组 ID,这些工件与现有产品的组 ID 冲突!这可能会导致项目的软件包和现有产品中的软件包之间冲突(因为组 ID 通常用作项目 Java 软件包名称的根目录)。

12.5.4. 自定义 POM 文件

您必须自定义 POM 文件来生成 OSGi 捆绑包,如下所示:

  1. 按照 第 5.1 节 “生成捆绑包项目” 中描述的 POM 自定义步骤操作。
  2. 由于客户端使用 HelloWorldSvc Java 接口,它在 osgi-service 捆绑包中定义,因此必须对 osgi-service 捆绑包添加 Maven 依赖项。假设 Maven 协调 osgi-service 捆绑包是 org.fusesource.example:osgi-service:1.0-SNAPSHOT,您应该将以下依赖项添加到客户端的 POM 文件中:

    <project ... >
      ...
      <dependencies>
        ...
        <dependency>
            <groupId>org.fusesource.example</groupId>
            <artifactId>osgi-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
      </dependencies>
      ...
    </project>

12.5.5. 编写蓝图文件

要在客户端项目中添加 Blueprint 文件,首先创建以下子目录:

ProjectDir/osgi-client/src/main/resources
ProjectDir/osgi-client/src/main/resources/OSGI-INF
ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint

ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint 目录下,使用您首选的文本编辑器创建文件 config.xml,并添加来自 例 12.6 “用于导入服务的蓝图文件” 的 XML 代码。

例 12.6. 用于导入服务的蓝图文件

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <reference id="helloWorld"
        interface="org.fusesource.example.service.HelloWorldSvc"/>

  <bean id="client"
        class="org.fusesource.example.client.Client"
        init-method="init">
    <property name="helloWorldSvc" ref="helloWorld"/>
  </bean>

</blueprint>

其中 reference 元素会创建一个参考管理器,它在 OSGi 注册表中找到 HelloWorldSvc 类型的服务。bean 元素创建 Client 类的实例,注入作为 bean 属性 helloWorldSvc 的服务引用。此外,init-method 属性指定在 bean 初始化阶段调用 Client.init () 方法(即,服务引用注入客户端 bean )。

12.5.6. 编写客户端类

ProjectDir/osgi-client/src/main/java/org/fusesource/example/client 目录下,使用您首选的文本编辑器创建文件 Client.java,并添加来自 例 12.7 “客户端类” 的 Java 代码。

例 12.7. 客户端类

package org.fusesource.example.client;

import org.fusesource.example.service.HelloWorldSvc;

public class Client {
    HelloWorldSvc helloWorldSvc;

    // Bean properties
    public HelloWorldSvc getHelloWorldSvc() {
        return helloWorldSvc;
    }

    public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) {
        this.helloWorldSvc = helloWorldSvc;
    }

    public void init() {
        System.out.println("OSGi client started.");
        if (helloWorldSvc != null) {
            System.out.println("Calling sayHello()");
            helloWorldSvc.sayHello();  // Invoke the OSGi service!
        }
    }

}

Client 类定义 getter 和 setter 方法,用于 helloWorldSvc bean 属性,它允许它通过注入来接收对 Hello World 服务的引用。init () 方法在 bean 初始化阶段调用,在属性注入后调用,这意味着通常在此方法范围内调用 Hello World 服务。

12.5.7. 运行客户端捆绑包

要安装并运行 osgi-client 项目,请执行以下步骤:

  1. 构建项目-open a command prompt,并将目录改为 ProjectDir/osgi-client。输入以下命令来使用 Maven 构建演示:

    mvn install

    如果这个命令成功运行,ProjectDir/osgi-client/target 目录应包含捆绑包文件 osgi-client-1.0-SNAPSHOT.jar

  2. 在 Red Hat Fuse 控制台中安装并启动 osgi-service 捆绑包-at,输入以下命令:

    karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar

    其中 ProjectDir 是包含 Maven 项目和 -s 标志的目录,则 -s 标志可指示容器立即启动捆绑包。例如,如果您的项目目录在 Windows 机器上是 C:\Projects,您可以输入以下命令:

    karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
    注意

    在 Windows 机器中,注意如何格式化 文件 URL - 有关 文件 URL 处理程序理解的语法的详情,请参阅 第 14.1 节 “文件 URL 处理程序”

  3. 客户端输出-f 客户端捆绑包成功启动,您应该在控制台中立即看到类似如下的输出:

    Bundle ID: 239
    OSGi client started.
    Calling sayHello()
    Hello World!
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.