`
snoopy7713
  • 浏览: 1152723 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

OSGi一小步–声明式服务

    博客分类:
  • OSGi
 
阅读更多

OSGi声明式服务是个好东西,有点依赖注入的味道,开发人员以配置的方式去注册或引用服务,你不需要为注册服务而单独写一个BundleActivator了,省去手工注册的繁琐。下面写一个例子改造上一篇代码的运行方式。

改造hello.service.consumer

去掉HelloServiceConsumer对BundleActivator的实现,变成一个非常普通的java类,部分代码如下:

//引用被注入的服务

private HelloService helloService;

//当组件变为satisfied时,该方法将被调用

public void activate(ComponentContext context) {

executor = Executors.newFixedThreadPool (1);

executor.execute(new HelloServiceVisitorTask());

System.out .println(“HelloServiceConsumer activate”);

}

//当组件变为unsatisfied时,该方法将被调用

public void deactivate(ComponentContext context) {

executor.shutdownNow(); //关闭服务访问线程

executor = null ;

System.out .println(“HelloServiceConsumer deactivate”);

}

//当SCR(Service Component Runtime)发现容器中注册有HelloService服务时,该方法将被

//调用,相当于注入helloService实例,该方法在组件激活前调用

public void setHelloService(HelloService helloService) {

System.out .println(“setHelloService”);

synchronized (helloServiceLock) {

if (this .helloService != helloService) {

this .helloService = helloService;

}}}

//当提供HelloService服务的组件变为不可用时,该方法将被调用,相当解绑引用

public void unsetHelloService(HelloService helloService) {

synchronized (helloServiceLock) {

if (this.helloService == helloService) {

this.helloService = null;

}}}

在src/main/resources目录下建立OSGi-INF目录,用来存放组件描述xml文件,内容如下:

<?xml version=”1.0″ encoding=”UTF-8″?>

<component name=”HelloServiceConsumerComponent”>

<!– 该组件没有提供服务 –>

<implementationMsoNormal” align=”left” style=”text-align:left;mso-layout-grid-align: none;text-autospace:none”>    <!–  引用服务  –>

<reference name=”HelloServiceComponent” interface=”org.lazyman.study.osgi.service.HelloService”

bind=”setHelloService” //绑定服务的方法

unbind=”unsetHelloService” //解绑服务的方法

//表示要求容器中存在HelloServiceComponent的个数,该参数影响组件的激活策略

cardinality=”0..1″

//在不调用deactivate情况重新绑定新的服务

policy=”dynamic” />

</component>

最后我们需要在MANIFEST.MF文件里增加新的头:

Service-Component: OSGi-INF/consumer.component.xml

改造hello.service.impl

去掉HelloServiceActivator类,增加hello.service.component.xml组件描述文件,内容如下

<?xml version=”1.0″ encoding=”UTF-8″?>

<component name=”HelloServiceComponent”>

<service>

// 表明提供org.lazyman.study.osgi.service.HelloService服务

<provide  interface=”org.lazyman.study.osgi.service.HelloService” />

</service>

// 服务实现类

<implementation />

</component>

同样需要在MANIFEST.MF文件里增加新的头:

Service-Component: OSGi-INF/hello.service.component.xml

部署运行

想激活基于服务的组件功能,需要增加如下bundle,可以去equinox网站下载

org.eclipse.equinox.ds    //提供SCR功能

org.eclipse.equinox.util  // ds的依赖

org.eclipse.osgi.services //osgi各种服务api

并且org.eclipse.equinox.ds bundle 必须在自定义bundle启动前启动,如下状态所示

Framework is launched.

id      State       Bundle

3       RESOLVED    hello.service.consumer_1.0.0

4       RESOLVED    hello.service.impl_1.0.0

5       RESOLVED    hello.service_1.0.0

6       RESOLVED    org.eclipse.equinox.ds_1.1.1.R35x_v20090806

7       <<LAZY>>    org.eclipse.equinox.util_1.0.100.v20090520-1800

8       RESOLVED    org.eclipse.osgi.services_3.2.0.v20090520-1800

启动 org.eclipse.equinox.ds bundle

start 6

id      State       Bundle

3       RESOLVED    hello.service.consumer_1.0.0

4       RESOLVED    hello.service.impl_1.0.0

5       RESOLVED    hello.service_1.0.0

6       ACTIVE      org.eclipse.equinox.ds_1.1.1.R35x_v20090806

7       ACTIVE      org.eclipse.equinox.util_1.0.100.v20090520-1800

8       RESOLVED    org.eclipse.osgi.services_3.2.0.v20090520-1800

分别启动5  4  3,可以看到如下结果

osgi> start 3

setHelloService //先调用服务绑定方法

HelloServiceConsumer activate //激活HelloServiceConsumerComponent

HelloService //调用服务接口方法的输出

该文总结了自己对OSGi声明式服务的学习历程,利用好这个功能可以让生活变得更加有趣!

目前启一个bundle都是手动start的,似乎有些麻烦,下篇将展示如何通过程序轻松启动所有bundle


–OSGi Declarative Services相关概念可以参见这篇文章(http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgids/index.html )

分享到:
评论

相关推荐

    OSGI 注册式服务

    注册式服务是OSGI服务模型的一种形式,它强调服务的动态性。与声明式服务不同,注册式服务不是在配置文件中静态声明的,而是由服务提供者在运行时通过编程方式动态注册。服务提供者通过实现特定接口并在OSGI服务...

    基于osgi构建小例子

    **基于OSGi构建小例子** OSGi(Open Service Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序拆分成独立的、可管理的模块,这些模块可以动态地安装、卸载和更新,而不影响系统的其他部分。在...

    OSGI服务 DS EVENT

    DS(Declarative Services)是OSGI中的一个核心服务,它提供了声明式的方式来管理和装配服务。而EVENT则是DS中关于事件处理的部分,用于在OSGI组件之间传递信息和协调工作。 OSGI服务是一种动态的服务注册和发现...

    OSGI的消息机制及注册服务

    另一种方法是使用EventAdmin服务,它是OSGI规范的一部分,提供了一种基于主题的消息传递机制。通过EventAdmin,bundle可以发布事件,其他bundle则可以订阅这些事件并处理它们。 接下来,我们谈谈OSGI中的服务注册。...

    osgi学习笔记(一)

    这本书可能会详细解释如何通过XML配置文件来声明服务,以及如何利用OSGi的动态性来实现热更新和故障恢复。 总结来说,OSGi提供了一个强大的模块化系统,通过服务导向的架构,使Java应用更加灵活和可维护。开发者...

    osgi服务(加法和乘法)

    OSGi(Open Services Gateway Initiative)服务是Java平台上的一种模块化系统和框架,它允许开发者将应用程序分解为独立的、可重用的组件,称为“bundle”。这些bundle可以在运行时动态安装、启动、更新和卸载,极大...

    osgi服务发布和获取方式

    OSGi(Open Service Gateway Initiative)是一种动态模块化的服务平台,能够动态地管理和部署服务。OSGi 服务发布和获取方式是 OSGi 框架中的一种核心机制,用于发布和获取服务。下面将详细介绍 OSGi 服务发布和获取...

    OSGi常用服务发布和获取方式总结

    OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务平台,它允许开发人员将应用程序分解为可独立更新和管理的模块。在OSGi环境中,服务是模块间通信的主要手段,而服务的发布和获取是OSGi核心概念...

    Equinox OSGi应用嵌入Jersey框架搭建REST服务

    OSGi(Open Service Gateway Initiative)是一种Java平台的标准,它允许开发者将应用程序分解为独立的、可重用的服务模块,每个模块称为一个Bundle。这种方式使得软件更加灵活,易于维护和升级。 在本文中,我们将...

    osgi介绍osgi介绍

    1. **模块化**:每个bundle都是一个独立的模块,有自己的类路径和资源,可以通过声明式服务来暴露和消费接口。 2. **动态性**:bundle可以在运行时安装、启动、停止或卸载,使得系统可以进行热更新,而不会中断服务...

    osgiDeclarativeService:OSGI 声明式服务技术证明

    osgi声明式服务待办事项...在文件夹中结帐。 启动 eclipse Galileo 并将该文件夹用作工作区文件 &gt; 将现有项目导入工作区。 应该有一个可以启动的 OSGI Run/Debug 配置。 待办事项更多信息...

    一个关于osgi的例子

    OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员将应用程序分解为一组独立的、相互依赖的模块,这些模块被称为服务。这个标题“一个关于osgi的例子”暗示我们将探讨如何...

    osgi-tutorial.zip

    与Spring框架的XML配置类似,Blueprint使得我们在OSGi环境中能够以声明式方式管理我们的应用程序组件。 接下来,我们将Spring框架与OSGi结合。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力著称,...

    OSGi崁入Servlet的配置步驟

    OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许开发人员将应用程序分解为一组可独立更新和管理的小型服务组件。在OSGi环境中嵌入Servlet,可以实现更加灵活和动态的Web应用部署。...

    OSGi入门篇:服务层

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

    spring osgi相关资源

    1. Spring DM是Spring对OSGi服务的扩展,提供了一种声明式的方式来管理OSGi Bundle中的Spring应用上下文。它允许开发者使用熟悉的Spring配置来定义服务和引用,简化了OSGi环境下的应用开发。 2. 自动化服务注册和...

    tomcat 集成 osgi服务,示例源码

    7. **TomcatOsgi**:这可能是集成OSGi到Tomcat的具体实现或者一个特定的模块,比如一个特殊的Servlet或Filter,用于处理OSGi相关的请求和管理OSGi服务。 在实际应用中,集成OSGi到Tomcat可以带来诸多好处,例如提高...

    OSGI + Webservice 例子

    1. **OSGI模块创建**:首先,你需要了解如何创建一个OSGI模块,这通常涉及到编写MANIFEST.MF文件,声明模块的依赖和导出的包。例如,OSGI.Api可能是提供公共接口的模块,OSGI.Ui可能是用户界面模块,而OSGI.Impl则是...

    OSGI 开发文档中文的

    OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建可模块化的Java应用程序。它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将...

    OSGI 实例eclipse插件开发

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序由一系列可独立更新和替换的模块组成,这些模块称为“bundle”。在本实例中,我们将探讨如何利用OSGI技术来开发Eclipse...

Global site tag (gtag.js) - Google Analytics