`
阅读更多

 

OSGi Service Registery你知多少

http://www.cnblogs.com/ygyinx/archive/2012/10/27/2742347.html

 

1.    发布服务可以关联一些属性。

<service ref="beanToBeExported" interface="com.xyz.MyServiceInterface"> 
    <service-properties> 
        <beans:entry key="myOtherKey" value="aStringValue"/> 
        <beans:entry key="aThirdKey" value-ref="beanToExposeAsProperty"/> 
    </service-properties> 
</service>

2.    每个以Spring Bean发布成服务都会有一个属性名为org.springframework.osgi.bean.name,对应的值为目标Bean的name。

<service ref="beanToPublish" interface="com.xyz.MessageService"/>

这个服务就会有一个属性org.springframework.osgi.bean.name,值为beanToPublish。 

3.    Spring DM引入一种Bean的作用域,叫bundle scope。当导出服务的Bean加了这个作用域后,导入这个服务的Bundle会创建一个新的服务Bean实例。

<service ref="beanToBeExported" interface="com.xyz.MessageService"/>
<bean id="beanToBeExported" scope="bundle" class="com.xyz.MessageServiceImpl"/>

4.    Controlling The Set Of Advertised Service Interfaces For An Exported Service.

当有一个Bean服务存在多个接口时,需要将接口都导出:

<service ref="beanToBeExported"> 
  <interfaces> 
    <value>com.xyz.MessageService</value> 
    <value>com.xyz.MarkerInterface</value> 
  </interfaces> 
</osgi:service>


or

<service ref="beanToBeExported" auto-export="interfaces"/>

auto-export有四种值:

disabled :如果 auto-export 属性未被指定,则该选项为默认值。接口列表必须使用interface 属性或 interfaces 子元素指定。 
interfaces :使用由服务类或其任何超类实现的所有公共接口注册服务。 
class-hierarchy :使用服务类或其任何公共超类注册服务。 
all-classes :结合 interfaces 和 class-hierarchy 选项。

注册服务的一些属性:

depends-on :

<service ref="beanToBeExported" interface="com.xyz.MyServiceInterface" depends-on="myOtherComponent"/>

配置beanToBeExported服务所依赖的组件myOtherComponent初始化。

context-class-loader :

用于配置使用第三方的classloader来加载服务。

ranking :

默放为0,如果存在多个可用的服务接口,那么返回具有最大的ranking值的服务。如果ranking值相同,刚返回service id小的那个。

<service ref="beanToBeExported" interface="com.xyz.MyServiceInterface"  ranking="9"/>

5.    多接口服务引用

<reference id="importedOsgiService"> 
  <interfaces> 
    <value>com.xyz.MessageService</value> 
    <value>com.xyz.MarkerInterface</value> 
  </interfaces> 
</reference>

这个reference的Bean是实现了MessageService,MarkerInterface接口的。

引用服务的一些属性 

filter属性

<reference id="asyncMessageService" interface="com.xyz.MessageService" filter="(asynchronous-delivery=true)"/>

过滤服务属性asynchronous-delivery为true的服务。

bean-name属性

<osgi:reference id="messageService" interface="com.xyz.MessageService" bean-name="messageServiceBean"/>

返回服务Bean的Id为messageServiceBean的服务。

cardinality属性

<osgi:reference id="messageService" interface="com.xyz.MessageService" cardinality="1..1"/>

默认值为1..1,说明总是有一个这样的服务存在。0..1说明不需要一直存在这样一个服务。

depends-on:

当depends-on属性Bean实例化后,这个服务才能查找该服务。

context-class-loader:

与上对应。如果两边都有,最后启作用的是exporter那端的。

timeout:

等待服务多少秒,默认300秒。 

List,set引用服务支持属性

interface filter bean-name cardinality context-class-loader

cardinality取值为0..N,1..N,前面说明可以不存在,后面说明至少存在一个。 

注意: 当一个Bundle暴露SubInterface接口服务,而另一个Bundle引入SuperInterface接口是不匹配的。

当注册的服务中有接口,类等,能通过greedy-proxying创建代理访问导入服务中的的所有包含在该Bundle中类。

 

<list id="services" interface="com.xyz.SomeService" greedy-proxying="true"/>
for (Iterator iterator = services.iterator(); iterator.hasNext();) { 
  SomeService service = (SomeService) iterator.next(); 
  service.executeOperation(); 
  // if the service implements an additional type 
  // do something extra 
  if (service instanceof MessageDispatcher) { 
    ((MessageDispatcher)service).sendAckMessage(); 
  } 
}

 

6.    服务监听Service Listener:

<service ref="beanToBeExported" interface="SomeInterface"> 
    <registration-listener ref="myListener" registration-method="serviceRegistered" unregistration-method="serviceUnregistered"/>
  <registration-listener registration-method="register">
    <bean class="SomeListenerClass"/>
  </registration-listener> 
</service>

public void anyMethodName(ServiceType serviceInstance, Map serviceProperties); 
public void anyMethodName(ServiceType serviceInstance, Dictionary serviceProperties);

ServiceType为服务接口interface,serviceProperties保存着这个服务的所有属性,兼容性考虑的话,可以选Dictionary。 
有另一种方法,不鼓励这样用,那就是实现Spring DM特定接口OsgiServiceRegistrationListener,这样做的好处是省去了声明registration-method,unregistration-method,坏处是你的类与Spring有引用关系,与JAVA简单POJO类编程。

Dealing With The Dynamics Of OSGi Imported Services 
An example of declaring a listener that implements OsgiServiceLifecycleListener:

<reference id="someService" interface="com.xyz.MessageService">
    <listener ref="aListenerBean"/>
</reference> 

An example of declaring an inline listener bean with custom bind and unbind methods: 

<reference id="someService" interface="com.xyz.MessageService">
    <listener bind-method="onBind" unbind-method="onUnbind">
        <beans:bean class="MyCustomListener"/>
    </listener>
</reference>

Listener Attributes:

ref bind-method unbind-mehtod

Listener And Service Proxies:

Spring管理这个服务,但是调用这个服务的时候实质是一个代理。这样做的原因是防止Listener持有一个服务的强引用。Lisenter感兴趣的是监听服务而不是依赖对等实例,更加关注服务接口,而不是他的身份,服务属性和服务跟踪。

7.    服务引用可以排序

<set id="myServices" interface="com.xyz.MyService" comparator-ref="someComparator"/> 
    <list id="myOtherServices" interface="com.xyz.OtherService"> 
    <comparator> 
        <beans:bean class="MyOtherServiceComparator"/> 
    </comparator> 
</list>

Comparator-ref是一个实现了java.util.Comparator接口的Bean。

<list id="myServices" interface="com.xyz.MyService"> 
  <comparator><natural basis="services"/></comparator> 
</list> 
<set id="myOtherServices"interface="com.xyz.OtherService"> 
  <comparator><natural basis="service-references"/></comparator> 
</set>

默认提供的一些排序,详细可以去了解下。

 

服务最佳实践

1.    在listener中不要执行太长的活动,因为这个方法是同步的,太长将会影响这个listener监听其他事件。 
2.    创建自己的listener,不要引用Spring DM 的API。 
3.    如果listener重复声明bind/unbind方法,可以考虑写一个通用的可重用的Bean。 
4.    服务属性优先java.util.Map而不是java.util.Dictionary。 
5.    重载方法要小心,因为当服务类型匹配方法服务类型的时候,该方法就会执行

public class MyListener { 
       void register(Object service, Map properties); 
       void register(Collection dataService, Map properties); 
       void register(SortedSet orderedDataService , Map properties); 
  } 

Object type - will match all services for which the listener is triggered. This method will be always called. 
Collection type - if this method is called, the Object method is also called. 
SortedSet type - if this method is called, then both the Object and Collection methods are called. 

Service Importer Global Defaults

default-timeout
<beans xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:osgi="http://www.springframework.org/schema/osgi"                                                
         osgi:default-timeout="5000">                                                                      
     <reference id="someService" interface="com.xyz.AService"/>
     <reference id="someOtherService" interface="com.xyz.BService" timeout="1000"/>
</beans:beans>

default-cardinality
<beans:beans 
         xmlns="http://www.springframework.org/schema/osgi"                                                     
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:beans="http://www.springframework.org/schema/beans"                                              
         xmlns:osgi="http://www.springframework.org/schema/osgi"                                                
         osgi:default-cardinality="0..X"                                                                    
         default-lazy-init="false">                                                                         

  <reference id="someService" interface="com.xyz.AService"/>
  <set id="someSetOfService" interface="com.xyz.BService"/>
  <list id="anotherListOfServices" interface="com.xyz.CService" cardinality="1..N"/>                        
</beans:beans>
分享到:
评论

相关推荐

    spring DM英文版

    Spring DM,全称为Spring Dynamic Modules,是Spring框架的一个扩展,主要设计用于开发在OSGi(Open Service Gateway Initiative)环境下的应用程序。OSGi是一种模块化系统,允许Java应用程序以组件的形式进行构建、...

    SpringDM笔记31-Testing with OSGi and SpringDM

    标题 "SpringDM笔记31-Testing with OSGi and SpringDM" 涉及到的是在OSGi环境中使用SpringDM进行测试的相关知识。OSGi(Open Service Gateway Initiative)是一种Java模块化系统,允许动态地发现、加载和卸载服务。...

    SpringDM笔记7-开发SpringDM Bundle

    **SpringDM笔记7-开发SpringDM Bundle** SpringDM(Spring Dynamic Modules)是Spring框架的一个扩展,专门用于OSGi(Open Service Gateway Initiative)环境中的应用程序开发。OSGi是一种Java模块化系统,它允许...

    SpringDM开发文档

    《SpringDM开发文档》是关于SpringDM框架的详细技术指南,该框架是在OSGi环境中运行Spring应用程序的关键组件。SpringDM,全称为Spring Dynamic Modules,是Spring框架针对OSGi(Open Service Gateway Initiative)...

    Spring DM

    **Spring DM 深度解析** Spring DM,全称为Spring Dynamic Modules,是Spring框架的一个扩展,主要用于在OSGi(Open Service Gateway Initiative)环境下管理服务和应用程序。OSGi是一种模块化系统,它允许Java应用...

    springDM开发指南(英文)

    《Spring Dynamic Modules (Spring DM) 开发指南》深入解析 一、引言 Spring Dynamic Modules (Spring DM),作为Spring框架的扩展,旨在为OSGi环境下的应用开发提供强大的支持。它将Spring的依赖注入和面向切面...

    springDM+felix

    标题中的“springDM+felix”指的是在Java领域中,Spring Dynamic Modules (Spring DM) 和Apache Felix两个开源框架的结合应用。Spring DM是Spring框架的一个扩展,专门用于服务导向架构(SOA)和OSGi(Open Services ...

    基于SpringDM的WEB应用开发

    Spring DM 1.1.x最大特性便是它可以支持在其中部署WEB应用我使用后感觉这是个很酷特性我甚 至觉得用这种方式开发基于OSGi WEB应用比使用Spring DM Server更好至少目前你可以获得更好便携性(可以 在多个Spring DM支持...

    基于spring dm server 的osgi 例子

    【标题】:“基于Spring DM Server的OSGi实例” 在IT领域,OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务平台,它允许开发者创建可热插拔的组件,从而提高了软件的可维护性和可扩展性。...

    springDM source

    SpringDM,全称为Spring Dynamic Modules,是Spring框架的一个扩展,专为基于OSGi(Open Services Gateway Initiative)的应用程序设计。OSGi是一种Java模块化系统,它允许开发人员创建可独立部署、热更新和依赖管理...

    学习SpringDM+OSGI的总结

    ### SpringDM与OSGI概述 #### OSGI概念解析 OSGI(Open Service Gateway Initiative),直译为“开放的服务网关初始化”,它是一系列针对Java动态化模块化系统的规范。OSGI不仅指代一个官方联盟,还代表着由该联盟...

    osgi选型比较 实例Equinox、Apache Felix与Spring DM

    在选择OSGi实现时,通常会考虑Equinox、Apache Felix和Spring DM(现在称为Spring OSGi),这三种流行的实现各有特点和优势。 1. **Equinox**:由Eclipse基金会维护,是OSGi R4规范的核心框架实现。Equinox以其稳定...

    SpringDM笔记6-Fragment及配置Log4j Fragment Bundle

    在本文中,我们将深入探讨Spring DM(现在称为Spring OSGi)中的Fragment Bundle以及如何配置Log4j在Fragment Bundle中的应用。Spring DM是Spring框架在OSGi(Open Service Gateway Initiative)环境下的扩展,它...

    Spring DM IN ACTION

    ### Spring Dynamic Modules (Spring DM) in Action:关键技术与实践指南 #### 一、Spring DM概述与模块化开发 - **Spring DM**(Spring Dynamic Modules)是Spring框架的一个扩展,它结合了OSGi(Open Service ...

    OSGi与Spring:Spring DM开发

    - 启动Eclipse IDE,选择一个用于存放项目的空文件夹作为工作空间,例如`C:\sample\springdm`。 - Eclipse 3.3版本内嵌了Equinox 3.3 OSGi容器,这为开发和调试OSGi模块提供了便利。 **4. 导入Spring DM JAR文件*...

    spring dm 动态模型

    OSGi,也称为 Java 语言动态模块系统,它为 Java 应用程序开发指定了...OSGi服务平台的Spring动态模型项目(即Spring动态模型,简称Spring DM)允许开发者构建Spring应用程序,这种应用程序能够在OSGi容器中进行部署。

    Spring DM集成Strtus2(一)

    标题“Spring DM集成Struts2(一)”指出我们要探讨的主题是关于如何在OSGi(Spring DM,即Spring Dynamic Modules)环境中集成Struts2框架。这是一个关键的Java Web开发中的技术结合,因为它允许开发者利用Spring的...

    Apress Pro Spring dm Server 2009

    《Apress Pro Spring dm Server 2009》是一本深度探索基于OSGi技术的Java应用服务器的专业书籍。这本书旨在帮助读者理解并充分利用Spring dm Server(后来被SpringSource Tool Suite集成,现称为Spring Boot)的核心...

    osgi+maven+springdm文档集

    **OSGI MAVEN SPRINGDM 文档集** 这个文档集主要涵盖了三个关键的Java开发技术:OSGI(Open Service Gateway Initiative)、Maven以及Spring Dynamic Modules(Spring DM)。这些技术都是现代Java开发中的重要组成...

Global site tag (gtag.js) - Google Analytics