`
阅读更多

OSGi架构研究

OSGi概述

       OSGiOpen Service Gateway Initiative的简称,该组织建立于1999年,是一个非赢利机构,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准。OSGi并不是专为家庭网络而制定的,除了住宅网关,像车载电脑等其他移动嵌入式设备也都可以通过OSGi接入Internet,获取不同的应用服务。它为服务供应商、软件供应商、网关开发人员以及设备供应商提供了一个开放、通用的架构,使它们能互动地开发、部署和管理服务。其软件环境基于Sun JAVA虚拟机,并不涉及具体的连接协议。对于任何新设备,它都能够灵活地将其纳入现有网络。可以使用OSGi的对象包括各种数字和模拟的机顶盒、服务网关、有线电视电缆调制解调器、消费类电子产品、PC、工业计算机、汽车等。

 

OSGi体系结构

以下是一张OSGi的体系结构图:

从上图的层次结构可以看出,Native Operating System层代表的是本地硬件与操作系统,Java VM层为跨平台应用提供了可能。而再往上,就是OSGi framework了。

Bundle实际就是一个具有jar(Java ARchive)格式的文件,其中包含了javaclass文件和其他资源文件(比如图标,配置文件等等)。Bundle可以在自己的manifest 文件中说明自己能够提供哪些java包,其他bundle如果在自己的manifest文件中指定了它需要这个包,那他们之间就可能产生java包的依赖关系,这样多个bundle之间就可以共享java包。

OSGiR4中将功能分为几层,包括:安全层、模块层、生命周期层、服务层和实际的服务。OSGi的核心实现即为OSGi框架,它本身也是一个OSGi Bundle

名称()

职责或功能

Security(安全层)

OSGi环境中应用的部署和管理提供更好的安全控制。

Modules(模块层)

主要负责bundle的安装部署,更新和卸载。

Life Cycle(生命周期层)

Bundle组件的安全和生命周期操作提供了API定义,该层位于安全层和模块层之上。

Services(服务层)

定义了一个与生命周期层紧密结合的组件动态交互模型。OSGi中的服务是实现了一个或多个Java接口的Java对象,通过将这些对象依据其实现的接口注册到服务注册表中,Bundle组件可以发布自己的服务,查找使用服务,注册监听处理服务的状态变更等。

Actual Services(实际的服务)

OSGi定义的一些标准的服务接口如日志服务(Log Service),包管理服务(Package Admin Service)、启动级别服务(Start Level Service)、HTTP服务(Http Service)、配置服务(Config Admin Service)、用户管理服务(User Admin Service)等。

 

OSGi容器

现在比较流行的开放源码的OSGi容器有以下三种:

 

a)  Equinox容器是参照OSGi规范第4版实现的,它构成了Eclipse IDE的核心—模块化的Java运行时;它实现了OSGi规范4中规定的必须强制实现的功能,同时,它也实现了OSGi规范中大部分的可选功能;

 

b) KnoflerfishOSGi规范第3版和第4版的开源实现,它实现了OSGi规范规定的必须实现的功能及部分可选功能;

 

c) ApacheFelixApache软件基金会实现的OSGi开源容器。

 

 


OSGi项目实践

技术是做出来的,不是想出来的。

以下,我将使用Equonix作为OSGi容器,来做一个小项目,将一天以来学习到的知识用到具体实践之中。

便携设备越来越多,连家庭主妇身边都可能有个PDA或者智能手机,优秀的家庭主妇都是管帐的高手,相信做一个支出管理系统会大卖特卖。现在忽略PDA或是智能机用的是什么硬件配置以及接口,用Swing来模拟前端界面。

 

我把这个系统命名为ExpenseManager,下面是系统的包结构:

 

 

pratice.domain       用来放实体类

pratice.service       存放支出管理系统提供服务的接口及其实现类

pratice.uri              界面相关的类

 

完成1.0版时的包结构如下:



 

 

其中,Expense是代表一条消费记录的实体类,其定义如下:

public class Expense {

   

    private int id;          //消费ID

    private String date; //消费时间

    private String item; //消费项目

    private float money;     //消费额

   

    public String getDate() {

       return date;

    }

    public void setDate(String date) {

       this.date = date;

    }

……//省略其它属性get,set方法

}

ExpenseDB类代表一个存储消费记录的数据库表,提供插入,检索数据,查询列名等操作,类图如下:





 

 
 
 

ExpenseManagerService是系统的服务接口,定义系统可以向外提供的功能,在1.0版中只实现了增加支出记录功能,以后可逐步增加诸如,删除,修改,统记等功能。下面给出接口及其实现类代码:

 

public interface ExpenseManagerService {

    public void addExpense(Expense expense);

}

 

public class ExpenseManagerServiceImpl implements ExpenseManagerService {

    private ExpenseDB expenseDB;

    public ExpenseManagerServiceImpl(ExpenseDB expenseDB) {

       this.expenseDB = expenseDB;

    }

    public void addExpense(Expense expense) {

       expenseDB.addExpense(expense);

    }

}

 

ExpenseManagerURI类是界面类,也是bundle中的Activator,继续自JFrame,同时实现BundleActivator接口。只要在MANIFEST.MF中指定

Bundle-Activator: pratice.uri.ExpenseManagerURI

framework就能通过ClassLoader找到pratice.uri.ExpenseManagerURI.class并加载后,就可以通过newInstance()方法创建一个BundleActivator的实例,然后调用public void start(BundleContext context)方法和void stop(BundleContext context)方法来管理bundle的生命周期。代码略。

       AddExpenseDialog是增加支出记录的对话框。

 

MANIFEST.MF文件内容如下:

Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Name: ExpenseManager Plug-in

Bundle-SymbolicName: ExpenseManager

Bundle-Version: 1.0.0

Bundle-Activator: pratice.uri.ExpenseManagerURI

Bundle-Localization: plugin

Import-Package: org.osgi.framework;version="1.3.0"

 

布署到Equonix容器后,执行效果见下图:




 
 

 

点击添加记录,跳出加支出记录的对话框。



 

输入数据提交后,在管理系统界面点击支出列表,罗列出支出记录。

 

为显示OSGi架构支持即插即用,动态部署的特性,在1.1版中增加统计消费额的功能,只要执行Equonix框架提供的更新命令,framework就完成对bundle的升级工作。为此,对源代码进行相应修改。

ExpenseManagerService接口增加统计方法,实现类与ExpenseDB类作相应修改。

 

public interface ExpenseManagerService { 

    public void addExpense(Expense expense);

    public float sumAllCost();

}

public class ExpenseManagerServiceImpl implements ExpenseManagerService {

    private ExpenseDB expenseDB;

    public ExpenseManagerServiceImpl(ExpenseDB expenseDB) {

       this.expenseDB = expenseDB;

    }

    public void addExpense(Expense expense) {

       expenseDB.addExpense(expense);

    }

    public float sumAllCost() {

       return expenseDB.sumAllCost();

    }

}

public class ExpenseDB {

   

    private List<Expense> expenseList;

……//其余代码省略

    public float sumAllCost() {

       float sum = 0;

       for(int i = 0; i <= expenseList.size(); i++ ){

           sum += ((Expense)expenseList.get(i)).getMoney();

       }

       return sum;

    }

}

MANIFEST.MF文件内容如下:

Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Namefont-size: 10pt; color: black; font-family:

  • 大小: 23.8 KB
  • 大小: 59.7 KB
  • 大小: 61.5 KB
  • 大小: 2.8 KB
  • 大小: 4.7 KB
  • 大小: 8 KB
  • 大小: 15.1 KB
  • 大小: 5.5 KB
  • 大小: 11.2 KB
  • 大小: 6.5 KB
  • 大小: 11.4 KB
分享到:
评论

相关推荐

    基于Android平台的OSGi架构中间件的研究与应用.pdf

    "基于Android平台的OSGi架构中间件的研究与应用.pdf" 本文主要研究了基于Android平台的OSGi架构中间件的设计和实现,旨在满足不同的Java环境和平台的需求,屏蔽了底层技术的复杂性,极大降低了智能家居应用系统的...

    分布式OSGi研究与发展.pdf

    分布式OSGi研究与发展是一项涉及计算机应用研究、分布式计算技术、以及OSGi框架融合的研究,旨在将OSGi技术应用于跨多个虚拟机的异构分布式处理。OSGi(Open Services Gateway initiative)是OSGi联盟针对嵌入式领域...

    基于OSGi的RFID服务架构的研究

    #### 三、RFID中间件的服务架构研究 **概念介绍** RFID中间件是连接RFID阅读器与企业应用程序之间的桥梁,它的主要作用是屏蔽底层硬件和通信协议的复杂性,提供统一的数据访问接口,从而简化应用开发的难度。...

    OSGI

    例如,开发工具如Eclipse就广泛采用了OSGI架构,允许插件以独立的bundle形式存在,方便安装、更新和卸载。 在实际应用中,OSGI的源码分析可以帮助我们深入理解其工作原理。例如,可以研究其bundle的加载过程、服务...

    OSGI原理最佳实践(包含源代码)

    是一本适合新接触OSGI开发学习的一本很好的书,本书介绍了Equinox, Spring-DM和Felix这三个常用的OSGi容器的使用、...本书适合希望了解、深入掌握OSGi,以及编写模块化、动态化Java应用的Java架构师和开发人员阅读。

    OSGi原理与最佳实践(完整版)&OSGi_in_action

    4. **案例研究**:提供真实世界中的OSGi应用案例,帮助读者理解OSGi在实际问题中的解决方案。 5. **社区与资源**:介绍OSGi社区、相关资源和学习路径,鼓励读者参与并持续学习。 通过这两本书,读者不仅可以了解...

    OSGi-lib.rar

    OSGi的核心是其服务导向的架构,它允许开发者将应用程序分解为独立的模块,这些模块称为"bundles"或"服务"。每个bundle都包含代码和元数据,描述了它提供的服务以及它依赖的服务。这种模块化的方法使得在运行时动态...

    org.eclipse.osgi_3.7.0.v20110613及源码

    《深入理解OSGi:以org.eclipse.osgi_3.7.0.v20110613及其源码为例》 OSGi(Open Services ...通过深入研究其3.7.0.v20110613版本及源码,开发者不仅能掌握OSGi的基本概念,还能在实践中提升软件设计和架构的能力。

    OSGi and Equinox

    OSGi和Equinox的技术细节及应用实例,以及它们如何在各种应用场景中发挥作用,都是值得深入研究和探讨的领域。了解这些概念对于当今面向服务的架构(SOA)和微服务架构趋势具有非常重要的意义。模块化不仅仅是技术...

    WPF界面-OSGI.net

    10. **未来发展趋势**:讨论WPF与OSGI结合的未来潜力,比如云原生应用、微服务架构,以及跨平台支持的可能性。 以上就是基于标题、描述和标签生成的相关知识点,这些内容对于理解和实践WPF与OSGI在.NET环境中的集成...

    Osgi in action.pdf

    2. **服务框架**:OSGi定义了一个服务框架,允许组件之间以服务的形式进行交互,从而实现了动态的依赖管理和插件式的架构。 3. **生命周期管理**:通过提供一个生命周期管理模型,OSGi使得组件可以在运行时动态安装...

    个人搜集的osgi帮助文档,内涵多个pdf

    通过研究这些材料,开发者可以掌握如何有效地利用OSGi来创建可维护、可扩展的Java应用程序,并理解其背后的原理和最佳实践。无论你是想要理解OSGi的基本概念,还是寻求解决特定问题的方案,这些文档都将提供宝贵的...

    OSGI in action.pdf

    7. **最佳实践与案例研究**:可能包括实际项目中的应用示例,展示如何有效地利用OSGI来解决复杂问题,比如大型企业级应用的模块化改造。 8. **工具支持**:介绍有助于OSGI开发的工具和框架,如Bndtools、Eclipse ...

    浅析OSGI的bundle依赖

    OSGI(Open Services Gateway Initiative)是一种...通过深入研究像"org.salever.osgi.depends.clientbundle"和"org.salever.osgi.depends.hostbundle"这样的示例,我们可以更好地掌握OSGI环境下的依赖管理和协作机制。

    osgi学习笔记(二)

    例如,可以研究Apache Felix或Equinox的源码,了解它们如何处理bundle的加载、依赖解析和服务注册等核心功能。 10. **挑战与解决方案** 虽然OSGi提供了很多优势,但也有一定的学习曲线和复杂性。解决这个问题的...

    osgi实战(pdf超请版)

    - **6.8.2 C/S**:探讨客户端/服务器架构下的OSGI应用开发。 - **6.8.3 嵌入式**:分析OSGI在嵌入式系统中的应用和优化方法。 - **6.9 注意事项**:总结在开发过程中需要注意的关键问题和常见陷阱。 #### 七、...

Global site tag (gtag.js) - Google Analytics