`
switchlau
  • 浏览: 54106 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转) OSGi入门:注册一个服务[译]

阅读更多

http://230996.blog.chinajavaworld.com/entry/3689/0/

 

欢迎回来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,之后——那确实可以通过服务的过滤仅仅显示器中的一个。不使用过滤,你将看到所有的注册了的服务。有着令人惊讶的巨大数字。


参考:
原始文章http://eclipsezone.com/eclipse/forums/t90688.html

分享到:
评论

相关推荐

    OSGI 入门资料PDF

    OSGI使用服务注册和发现机制,允许组件之间通信,而无需硬编码依赖关系。 2. OSGI实战: 在实践中,OSGI被广泛用于大型复杂项目,如企业级应用、嵌入式系统和设备。例如,通过OSGI,开发者可以在不重启整个应用的...

    OSGi入门篇:服务层

    当一个bundle(OSGi中的模块化包)中的服务实现类准备好提供服务时,它会将服务注册到OSGi的服务注册表中。服务注册表遵循“发布-查找-绑定”的模型,即服务的提供者发布服务,服务的使用者查找并绑定到服务。 - ...

    OSGI入门和例子

    3. **服务注册与发现**:OSGI提供了服务注册和服务发现机制,允许bundle之间以声明式的方式提供和查找服务。这增强了系统的可扩展性和解耦性。 4. **版本管理**:OSGI支持多个版本的相同包共存,每个bundle都可以...

    OSGi入门教程(OSGi Introduce)

    OSGi的核心概念是基于Java的模块化,它的主要目标是为各种设备提供一个开放的服务平台,包括室内设备、交通工具、移动电话等,用于管理和分发应用程序和服务。 OSGi的特点主要包括: 1. **插件化(Bundles)**:...

    OSGi入门篇:生命周期层

    OSGi(Open Services Gateway Initiative)是一个基于Java语言的服务平台,提供了一种动态化、模块化的应用程序架构。在OSGi架构中,整个生命周期管理是十分重要的组成部分,它保证了应用能够动态地进行安装、启动、...

    Spring OSGi 入门.pdf

    - **导出OSGi服务:**可以将普通的Spring Bean导出为OSGi服务,示例中`<osgi:service>`元素定义了服务的实现类和服务接口。 #### 五、导出OSGi服务 - **将普通Spring Bean导出为OSGi服务:**如上所示,通过`<osgi:...

    Spring OSGi 入门.rar

    2. OSGi:OSGi是一套用于Java平台的动态模块系统,它定义了一种标准的模块化体系结构,使得组件之间可以互相发现、加载和卸载,同时提供了服务注册和发现机制,增强了软件的可维护性和可扩展性。 3. Spring OSGi:...

    OSGi入门资料-初探OSGi 的全文

    OSGi的入门资料,网上找的,初探OSGi 的全文

    OSGi入门篇:模块层(by 静默虚空)

    在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...

    深入理解OSGi:Equinox原理、应用与最佳实践.pdf

    OSGi(Open Service Gateway Initiative)是一个定义了Java应用程序如何组织和模块化以及如何动态发现、启动、停止、更新这些模块化组件的规范。Equinox是OSGi规范的一个实现,它是由Eclipse基金会开发的。本文将...

    OSGI入门和整合Spring

    OSGI的核心概念是bundle,每个bundle都是一个自包含的单元,包含了运行所需的类、资源和元数据。Bundles通过导出和导入包来共享代码,这类似于Java的import语句,但更加强大和灵活。OSGI框架负责管理这些依赖关系,...

    tomcat嵌入OSGI容器

    此外,OSGI还提供了服务注册和发现机制,使得Bundle可以动态地提供和消费服务,增强了系统的可扩展性和可维护性。 **Tomcat与OSGI的整合:** 1. ** Felix或Equinox插件**:最常见的将OSGI引入Tomcat的方法是使用...

    OSGI的消息机制及注册服务

    在OSGI环境中,消息机制是实现bundle之间通信的关键部分,而服务注册是OSGI中实现模块间服务发现和交互的核心功能。下面将详细探讨这两个知识点。 首先,我们来了解一下OSGI的消息机制。在OSGI框架中,bundle之间的...

    OSGi 入门+进阶+实战

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

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

    3. **服务注册与发现**:OSGI服务是模块间通信的基础,模块可以通过服务注册表动态注册和查找服务,实现解耦合。 4. **配置管理**:OSGI提供了一种动态更改模块配置的方法,允许在运行时调整模块行为。 5. **包版本...

    spring-osgi 入门手册和代码

    Spring OSGi 是一个将 Spring 框架与 OSGi(Open Service Gateway Initiative)容器相结合的开源项目,旨在提供一种在 OSGi 环境下使用 Spring 的方式。OSGi 是一种模块化系统,它允许开发人员创建可热部署、可升级...

    精彩:OSGI入门以及提升

    OSGI的核心是其服务导向架构,它为Java应用程序提供了一个动态、灵活的运行时环境。这个压缩包文件包含了关于OSGI的基础知识和实践应用,包括实例代码和技术文章,对于学习和提升OSGI技能非常有帮助。 在OSGI入门...

Global site tag (gtag.js) - Google Analytics