`
catchid2003
  • 浏览: 18959 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

OSGI入门:注册一个服务

    博客分类:
  • OSGI
阅读更多

欢迎回来EclipseZone OSGi迷你系列。终于,我们准备接触Services了。我认为,Service层是OSGi最精彩的部分,所以接下来的部分将会很有趣。

上一次我们看了MovieFinder接口的例子,我们讲了将使用MovieLister搜索影片。事实上你可以认为这个例子——它从Martin Fowler的著名页上的“依赖注入”,也正如所知道的“反转控制”(Inversion of Control)或IoC。

重新用IoC来尝试解决这个问题。一个MovieLister并不特别关心原始电影数据的出处,所以我们使用MovieFinder接口来从它隐藏细节。思想是我们可以代替MovieFinder的任一细节,比如获取数据库或者甚至调用一个Amazon Web Service,既MoiveLister仅仅依赖于这个接口,不是任意具体实现。

到目前为止一切顺利,但是在一些点上,我们必须确实给一个具体的MovieFinder到MovieLister的实现。与其让MovieLister到外面去调用一个查找方法,不如我们用一个外部的容器“推”一个合适的对象给它。因此这个成为反转控制。不少这样的容器已经被开发出来了,例如PicoContainer,HiveMind,Spring甚至是EJB3.0。可是所有这些容器都有一个限制:它们大多是静态的。一旦一个MovieFinder给予了一个MovieLister,它就相当于JVM的生命期。

OSGi也允许我们实现IoC模式,但是在动态方法中。它可能动态的提供MovieFinder的实现给MovieLister并在之后移除它们。接下来,我们能够做到在一个文本文件查找电影的应用程序到使用Amazon Web Services的查找它们的热交换。

这就是服务层帮我们做的。十分简单,我们注册一个MovieFinder服务到Service Regisgry中。之后MovieLister可以用那个MovieFinder服务被提供出来。一个服务因此不比一个Java对象——POJO多些什么——并且它被注册在Java接口的名称下面(一个POJI?)。

这次,我们将这是看看使用registry来注册服务。稍后,我们看看如何获得这个registry外的服务并提供一个MovieLister。

我们将添加上次我们建立的BasicMovieFinder的Bundle。我们不需要修改已存在的类,我们仅仅需要添加一个Bundle的激活器。所以复制以下代码到osgitut/movies/impl/BasicMovieFinderActivator.java文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package osgitut.movies.impl;
 
import org.osgi.framework.*;
 
import osgitut.movies.*;
import java.util.Properties;
import java.util.Dictionary;
 
public class BasicMovieFinderActivator implements BundleActivator {
    private ServiceRegistration registration;
 
    public void start(BundleContext context) {
        MovieFinder finder = new BasicMovieFinderImpl();
 
        Dictionary props = new Properties();
        props.put("category", "misc");
 
        registration = context.registerService(
                               MovieFinder.class.getName(),
                               finder, props);
    }
 
    public void stop(BundleContext context) {
        registration.unregister();
    }
}




现在替换BasicMovieFinder.mf的内容:

1
2
3
4
5
6
7
8
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Basic Movie Finder
Bundle-SymbolicName: BasicMovieFinder
Bundle-Version: 1.0.0
Bundle-Activator: osgitut.movies.impl.BasicMovieFinderActivator
Import-Package: org.osgi.framework,
 osgitut.movies;version="[1.0.0,2.0.0)"



自从上一次以来,有两个信息被添加到这个manifest。第一个是Bundle-Activator行,它告诉框架关于我们的Bundle的新激活器——我们上次没有用到它。同样,我添加了org.osgi.framework到这个导入到包。正如我们的Bundle的上版本不能同框架交互,它不需要导入这个OSGi API包。

现在你可以重新建立BasicMovieFinder.jar文件:

1
2
> javac -classpath equinox.jar:MoviesInterface.jar osgitut/movies/impl/*.java
> jar cfm BasicMovieFinder.jar BasicMovieFinder.mf osgitut/movies/impl/*.class



回到OSGi控制台,你将看到上次的BasicMovieFinder.jar仍然被安装着。那么你只需要通过输入update N来告诉OSGi去更新这个Bundle,这个N是Bundle的数字标识(你用ss命令找到的那个)。现在使用start N来启动Bundle并且你会看见……很小的事情发生了。

事实上,我们仅仅用OSGi Service Registry注册了我们第一个服务,但是可惜的是没有人在“另一端”,所以这个注册不能产生任何可视化的影响。如果我们想要亲自保证我们的代码实际做了些什么,我们将继续挖掘,并且我们可以使用以下命令:

1
services (objectClass=*MovieFinder)



我们将看到以下输出:

1
2
3
{osgitut.movies.MovieFinder}={category=misc, service.id=22}
  Registered by bundle: file:BasicMovieFinder.jar [4]
  No bundles using service.



很好,我们的服务被注册了,并且我很想继续告诉你如何查找服务并在其他的Bundle中使用它,但是那将在另外一天了。在这期间,看看你可以用services命令做些什么。开始时常是输入没有任何表达式的services,之后——那确实可以通过服务的过滤仅仅显示器中的一个。不使用过滤,你将看到所有的注册了的服务。有着令人惊讶的巨大数字。

分享到:
评论

相关推荐

    OSGI 入门资料PDF

    Spring是一个流行的Java应用框架,OSGI与Spring的结合可以提供更强大的模块化能力。Spring Dynamic Modules(Spring-DM)是用于OSGI的Spring扩展,它使得Spring应用可以无缝地在OSGI环境中运行。通过Spring-DM,你...

    OSGi入门篇:服务层

    OSGi(Open Service Gateway Initiative)是一个Java社区定义的模块化服务平台,它允许在同一个运行环境中部署多个版本的同一个组件,而不会相互冲突,从而提供了一个动态的、模块化的运行时环境。OSGi规范定义了...

    OSGI入门和例子

    标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...

    Spring OSGi 入门.rar

    CalculatorServiceBundle提供一个实现了加法运算的接口和实现类,并注册为OSGi服务。ClientBundle则在启动时查找并使用这个服务执行计算任务。 通过这种方式,Spring OSGi帮助开发者构建更灵活、可扩展的应用系统,...

    OSGi 入门+进阶+实战

    3. **服务注册与查找**:OSGi服务是一个可发现和使用的对象,可以通过服务注册表注册和查找,实现组件之间的松耦合通信。 4. **版本管理**:OSGi支持包版本管理,允许不同版本的包共存,避免了版本冲突问题。 5. *...

    Spring OSGi 入门.pdf

    创建一个服务接口,实现该接口的提供者捆绑,并在消费者捆绑中通过 OSGi 服务注册表查找并使用该服务。 ### 7. 进阶话题 深入学习 Spring OSGi,可以研究安全性、远程服务、事件处理、事务管理等高级特性。同时,...

    OSGI资料,OSGI进阶,OSGI实战,OSGI入门和整合Spring

    《OSGI入门和整合Spring》则关注OSGI与Spring框架的结合,主要讨论: 1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用...

    spring osgi 入门

    2. **Scope配置**: 设置`scope="bundle"`表示为每个服务导入者创建一个新的服务实例。 3. **包导出**: 需要在MANIFEST.MF文件中通过`Export-Package`指令导出相关的包,以便其他Bundle可以访问这些服务。 **示例...

    osgi入门与实践

    3. **创建消费者 Bundle**:创建另一个 Bundle 来查询并使用之前注册的服务,实现服务的调用逻辑。 4. **部署并运行**:将 Bundle 部署到 OSGi 容器中,并运行容器观察结果。 通过上述过程的学习,可以初步掌握 ...

    Spring OSGI 快速入门中文教程

    - **服务注册与发现**:OSGi服务机制允许模块之间通过注册和查找服务进行通信,提供灵活的依赖注入。 **2. Spring OSGi的优势** - **容器管理**:Spring OSGi容器负责Bundle的生命周期管理和服务发现。 - **依赖...

    OSGI入门和整合Spring

    ### OSGi入门与Spring整合知识点详解 #### 一、OSGi基础知识介绍 **OSGi (Open Service Gateway Initiative)** 是一种模块化系统和框架,旨在为 Java 平台带来模块化编程的优势。它允许开发者创建可插拔的、动态...

    osgi入门

    **标题:“OSGi入门”** **描述:** 这篇博客文章主要介绍了OSGi(Open Services Gateway Initiative)的基础知识,包括它的起源、概念以及在Java开发中的应用。作者通过一个实际的例子来帮助读者理解如何使用OSGi...

    OSGI 经典实例,入门

    OSGI框架由一组称为"bundle"的模块组成,每个bundle都是一个自包含的Java程序单元,包含类、资源以及元数据。这些bundle可以通过导出和导入包来声明它们提供的服务和依赖的服务。这种模块化设计使得开发者能够轻松地...

    OSGi 入门 学习 实战 进阶

    总的来说,这个压缩包提供了一个全面的OSGi学习资源集合,包括理论、实战案例和最佳实践,适合从入门到进阶的学习者。通过这些资料,你可以系统地掌握OSGi的核心概念,理解它的模块化机制,学会如何构建、部署和管理...

    经典OSGI学习资料

    OSGI的另一个关键特性是服务注册与发现。通过OSGI服务注册表,模块之间可以发现并使用彼此提供的服务,而无需硬编码依赖。这种方式提高了代码的解耦性和可重用性,使得应用更加灵活和可扩展。 学习OSGI时,你需要...

    OSGi (Open Service Gateway Initiative)入门

    **OSGi入门** OSGi(Open Service Gateway Initiative)是一个开放标准,它定义了一种模块化系统,用于在Java平台上构建动态、可管理的应用程序。这个技术最初的目标是为家庭网络设备提供服务网关,但随着时间的...

Global site tag (gtag.js) - Google Analytics