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

OSGi容器中Bundle之间Synchronous Communication

阅读更多

  OSGi Core定义了一个服务层,提供了一个Bundle之间交互的简单机制,通过注册Java Object 至OSGi service registry。      Blueprint Container

    (1) Blueprint Configuration

    默认配置文件位于:ProjectDir/src/main/resources/OSGI-INF/blueprint

    默认XML文件命名空间:

Xml代码   收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  3.     ...  
  4. </ blueprint >   

     自定义配置文件地址:

     Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml

 

     Mandatory dependencies:

     OSGi Service 中Dependencies默认是必须的,但可通过设置reference和reference-list元素的availability为optional

     来改变这中现象。正常情况下,当Bluepring Container初始化时,通过一定范围的时间来允许Dependencies

     Resolve, 该时间么哦人为:5秒,可通过下面的方式自定义:

Xml代码   收藏代码
  1. Bundle-SymbolicName: org.fusesource.example.osgi-client;  
  2. blueprint.graceperiod: = true ;  
  3. blueprint.timeout: 10000   

    (2) Defining a Service Bean

    (3) Exporting a Service

    1. Exporting with a single interface

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < bean   id = "savings"   class = "org.fusesource.example.SavingsAccountImpl"   />   
  3.     < service   ref = "savings"   interface = "org.fusesource.example.Account"   />   
  4. </ blueprint >   

     2. Exporting with multiple interfaces

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.       
  3.     < bean   id = "savings"   class = "org.fusesource.example.SavingsAccountImpl"   />   
  4.     < service   ref = "savings" >   
  5.         < interfaces >   
  6.             < value > org.fusesource.example.Account </ value >   
  7.             < value > org.fusesource.example.SavingsAccount </ value >   
  8.         </ interfaces >   
  9.     </ service >   
  10. </ blueprint >   

    注意:interface和interfaces不能同时在service元素中使用。

    3. Exporting with auto-export

    例如:下面的代码中Blueprint将自动注册所有SavingsAccountImpl实现的public接口:

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < bean   id = "savings"   class = "org.fusesource.example.SavingsAccountImpl"   />   
  3.     < service   ref = "savings"   auto-export = "interfaces"   />   
  4. </ blueprint >   

     其中auto-export默认值为:disabled,其他可选值为:

     interfaces:注册该类实现的所有public的接口;

     class-hierarchy:注册该类自己以及他的父类,但不包含Object类;

     all-classes:注册该类自己以及他的父类,同时包括该类实现的接口。

     4. Setting service properties

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < bean   id = "savings"   class = "org.fusesource.example.SavingsAccountImpl"   />   
  3.     < service   ref = "savings"   auto-export = "interfaces"   ranking = "10" >   
  4.         < service-properties >   
  5.             < beans:entry   key = "bank.name"   value = "HighStreetBank"   />   
  6.         </ service-properties >   
  7.     </ service >   
  8. </ blueprint >   

    说明:A.  注册的service默认的Properties有:osgi.service.blueprint.compname值为service  bean 的id

                B.  service.ranking 是系统自动设置。

                C.  当系统查找服务时返回对个匹配的服务时,默认选择ranking值最高的服务,因此可配置该属性用以服务

     之间的区分。

     5. Specifying a registration listener

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0"  . >   
  2.     < bean   id = "listenerBean"   class = "org.fusesource.example.Listener"   />   
  3.     < service   ref = "savings"   auto-export = "interfaces" >   
  4.         < registration-listener   ref = "listenerBean"   
  5.             registration-method = "register"   unregistration-method = "unregister"   />   
  6.     </ service >   
  7. </ blueprint >   

 

Java代码   收藏代码
  1. //Java   
  2. package  org.fusesource.example;  
  3.   
  4. public   class  Listener {  
  5.     public   void  register(Account service, java.util.Map serviceProperties) {  
  6.     }  
  7.   
  8.     public   void  unregister(Account service, java.util.Map serviceProperties) {  
  9.     }  
  10. }  

     说明:register和unregister方法的参数,第一个参数可以是service class或service class 实现的接口,因为该

     参数包含service instance,  如果该service bean 被声明为property, 在注册的时候是没有service instance可用

     的,因此此时该参数的值为null.

     第二个参数可以是java.util.Map或java.util.Dictionary,这个Map包含service 注册时的Properties.

     (4) Importing a Service

     使用reference和reference-list元素Import Service, 两者之间的区别是:reference用于访问stateless service,

     而reference-list用于访问stateful service.

     1. Matching by interface (stateless)

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < reference   id = "savingsRef"   interface = "org.fusesource.example.SavingsAccount"   />   
  3.     < bean   id = "client"   class = "org.fusesource.example.client.Client" >   
  4.         < property   name = "savingsAccount"   ref = "savingsRef"   />   
  5.     </ bean >   
  6. </ blueprint >   

 

Java代码   收藏代码
  1. package  org.fusesource.example.client;  
  2.   
  3. import  org.fusesource.example.SavingsAccount;  
  4.   
  5. public   class  Client {  
  6.     SavingsAccount savingsAccount;  
  7.   
  8.     // Bean properties   
  9.     public  SavingsAccount getSavingsAccount() {  
  10.         return  savingsAccount;  
  11.     }  
  12.   
  13.     public   void  setSavingsAccount(SavingsAccount savingsAccount) {  
  14.         this .savingsAccount = savingsAccount;  
  15.     }  
  16. }  

     2.  Matching by interface (stateful)    

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < reference-list   id = "savingsListRef"   
  3.         interface = "org.fusesource.example.SavingsAccount"   />   
  4.     < bean   id = "client"   class = "org.fusesource.example.client.Client" >   
  5.         < property   name = "savingsAccountList"   ref = "savingsListRef"   />   
  6.     </ bean >   
  7. </ blueprint >   

 

Java代码   收藏代码
  1. package  org.fusesource.example.client;  
  2.   
  3. import  org.fusesource.example.SavingsAccount;  
  4.   
  5. public   class  Client {  
  6.     java.util.List<SavingsAccount> accountList;  
  7.   
  8.     // Bean properties   
  9.     public  java.util.List<SavingsAccount> getSavingsAccountList() {  
  10.         return  accountList;  
  11.     }  
  12.   
  13.     public   void  setSavingsAccountList(java.util.List<SavingsAccount> accountList) {  
  14.         this .accountList = accountList;  
  15.     }  
  16. }  

     3. Matching service properties with a filter

Xml代码   收藏代码
  1. < reference   id = "savingsRef"   interface = "org.fusesource.example.SavingsAccount"   filter = "(bank.name=HighStreetBank)"   />   
  2.   
  3. < reference-list   id = "savingsRef"   interface = "org.fusesource.example.SavingsAccount"   filter = "(bank.name=HighStreetBank)"   />   

     4. Specifying whether mandatory or optional

     默认值:mandatory

Xml代码   收藏代码
  1. < reference   id = "savingsRef"   interface = "org.fusesource.example.SavingsAccount"   availability = "mandatory"   />   

     5. Specifying a reference listener

Xml代码   收藏代码
  1. < blueprint   xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0" >   
  2.     < reference   id = "savingsRef"   interface = "org.fusesource.example.SavingsAccount" >   
  3.         < reference-listener   bind-method = "onBind"   
  4.             unbind-meth od = "onUnbind" >   
  5.             < bean   class = "org.fusesource.example.client.Listener"   />   
  6.         </ reference-listener >   
  7.     </ reference >   
  8.     < bean   id = "client"   class = "org.fusesource.example.client.Client" >   
  9.         < property   name = "savingsAcc"   ref = "savingsRef"   />   
  10.     </ bean >   
  11. </ blueprint >   

 

Java代码   收藏代码
  1. package  org.fusesource.example.client;  
  2.   
  3. import  org.osgi.framework.ServiceReference;  
  4.   
  5. public   class  Listener {  
  6.     public   void  onBind(ServiceReference ref) {  
  7.         System.out.println("Bound service: "  + ref);  
  8.     }  
  9.   
  10.     public   void  onUnbind(ServiceReference ref) {  
  11.         System.out.println("Unbound service: "  + ref);  
  12.     }  

分享到:
评论

相关推荐

    tomcat嵌入OSGI容器

    标题中的“tomcat嵌入OSGI容器”是指在Apache Tomcat服务器中集成OSGI(Open Service Gateway Initiative)框架,使得Tomcat能够支持模块化的应用程序部署和管理。OSGI是一种Java平台上的服务导向架构,它允许动态地...

    osgi多个bundle读取同一配置文件

    osgi多个bundle之间读取同一配置文件,需要单独添加一个用来读取配置文件的bundle

    WEB容器托管OSGi容器(轻量级集成方式)

    示例源码工程可能包含了如何在实际项目中实现这一轻量级集成的代码示例,包括如何配置Web容器以托管OSGi容器,如何编写和打包OSGi Bundle,以及如何在Web应用中使用OSGi服务等。 通过阅读和理解这个源码工程,...

    osgi在web容器中部署的例子

    3. 将OSGi bundle部署到容器:将`com.sample.web_1.0.0.jar`和`com.sample.web.zip`中的bundle导入到OSGi容器中,这通常通过容器的管理界面或命令行工具完成。 4. 部署Web应用:如果`bridge.war`是一个Web应用,...

    osgi 在web容器中部署

    在Web容器中部署OSGi应用,特别是像Tomcat这样的流行Servlet容器,可以提高应用的灵活性、可维护性和可扩展性。本文将详细介绍如何使用桥接技术(如Apache Felix的WebConsole或Pax Web)在Tomcat中部署OSGi程序。 ...

    OSGI bundle

    这通常涉及到设置IDEA的项目结构、添加Felix框架的依赖、配置运行配置等操作,使得开发者可以在IDEA中调试和测试OSGI bundle。 **总结** OSGI bundle提供了一种模块化的软件开发方式,使得Java应用程序可以按需...

    浅析OSGI的bundle依赖

    在OSGI环境中,每个bundle都是一个独立的代码单元,具有自己的类路径,并且可以有自己的依赖关系。这篇博客“浅析OSGI的bundle依赖”可能探讨了如何管理和解决这些模块间的依赖问题。 首先,我们来看一下OSGI中的...

    OSGI应用中整合Spring、Mybatis、Spring MVC案例

    3. 配置Pax Web或类似的Servlet容器,以支持OSGI bundle中的Spring MVC应用。 4. 在Spring MVC中定义Controller,这些Controller作为OSGI服务运行。 5. 调整Web应用的部署描述符(如web.xml),确保它与OSGI环境兼容...

    OSGi with CAR-Bundle

    3. **Bundle作为组件**:每个Bundle可以被视为独立的组件,它们之间通过OSGi服务注册表进行交互,实现动态的依赖管理和服务发现。 4. **使用脚本管理组件**:引入脚本语言,如JavaScript或Groovy,可以更灵活地管理...

    osgi发布http服务的各种bundle,各种jar包,全全全~

    osgi发布http服务的各种bundle,各种jar包,全全全~非常好用的技术包 包括:org.eclipse.equinox.http_1.0.0.v20060601a.jar org.eclipse.equinox.ds_1.0.0.v20060601a.jar org.eclipse.equinox.servlet.api_1.0.0...

    OSGi与Web容器的整合

    这是通过像Equinox的Servlet Bridge这样的技术实现的,它充当了一个桥梁,让OSGi Bundle可以在传统的Web容器中运行。但是,这种方法并不理想,因为它通常较为复杂,而且Web项目本身并没有模块化为OSGi Bundle,因此...

    基于EQUINOX的 OSGI BUNDLE 运行例子

    标题"基于EQUINOX的OSGI BUNDLE运行例子"指的是一个实际操作示例,展示了如何在EQUINOX OSGi环境中运行OSGi Bundle。EQUINOX提供了一个完整的运行时环境,使得开发者可以方便地管理和执行这些模块化的Bundle。 描述...

    Spring OSGI 快速入门中文教程

    - **容器管理**:Spring OSGi容器负责Bundle的生命周期管理和服务发现。 - **依赖注入**:Spring的DI特性与OSGi服务相结合,简化了模块间的依赖管理。 - **热部署**:在运行时可以更新Bundle,无需重启系统。 - **...

    OSGI bundle change listener

    总结来说,`OSGI bundle change listener`是OSGi框架中用于监控bundle状态变化的关键机制,它允许开发者对bundle的生命周期进行精细控制,实现动态的服务注册、依赖管理和系统自适应配置。结合像VisualVM这样的工具...

    OSGI进阶插件开发

    3. **系统测试**:在实际OSGi容器中运行所有bundle,验证整个系统的功能和稳定性。 五、OSGi实践 1. **插件系统**:利用OSGi创建可扩展的应用程序框架,如Eclipse IDE就是基于OSGi的插件系统。 2. **分布式系统**...

    osgi基础demo-搭建servlet

    6. **部署Bundle**:将Servlet Bundle安装到OSGi容器中。这可以通过容器的命令行接口、图形用户界面或API完成。 7. **启动和访问Servlet**:启动Servlet Bundle后,可以通过HTTP服务暴露Servlet,以便通过HTTP请求...

    基于Eclipse的Equinox框架开发OSGi Bundle应用

    **示例应用**:压缩包中的"osgi_example"可能包含了一个简单的OSGi Bundle示例,例如,创建一个HelloWorld服务,其他Bundle可以注册和使用这个服务。 总结来说,基于Eclipse的Equinox框架开发OSGi Bundle应用,可以...

    基于OSGi的 webbundle

    启动一个Web Bundle时,OSGi容器会解析MANIFEST.MF中的信息,并将Web应用部署到Jetty服务器上。停止时,Web应用从服务器上卸载,但Bundle本身仍保留在系统中。 **Web Bundle的优势** 1. **动态性**:Web Bundle...

    Jar转换为Bundle工具

    标题中的“Jar转换为Bundle工具”指的是将传统的Java Archive (JAR) 文件转换为OSGI Bundle的过程。OSGI(Open Service Gateway Initiative)是一种模块化系统和Java服务框架,它允许在单个Java虚拟机(JVM)上运行...

    osgi 资料 总结 实践

    Spring DM允许在OSGi容器中管理Spring应用的bean和服务。 - **与Hibernate的集成**:在OSGi环境中使用Hibernate,需要处理类加载和依赖的问题。可以通过使用特定的OSGi友好的Hibernate版本或适配器,如Hibernate ...

Global site tag (gtag.js) - Google Analytics